分享

删除该链表中重复的结点(BAT面试题)

 昵称70680357 2020-07-01

一,题目描述
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。
例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
二,解决思路
1,创建一个带傀儡节点的新链表,用来保存原有链表中不重复的节点
2,遍历给定链表将不重复的节点尾插入新链表
3,遍历分为双重循环,外层循环整体循环,内部循环只是为了跳过连续几个相等的元素
三,代码实现

public ListNode deleteDuplication(ListNode pHead) {
        ListNode newHead = new ListNode(-1); //创建一个带傀儡节点的新链表
        ListNode newTail = newHead;

        // 循环遍历链表
        ListNode cur = pHead; 
        while (cur != null) {
        // 判定 cur 是否是重复元素
        // 时刻牢记, 针对某个引用进行 . 操作的时候, 必须保证该引用不能是 null
        // 假设 cur 已经指向 最后一个元素了, cur.next 就是 null
        // 短路求值. 左侧表达式如果为 false, 右侧就不求值了(对于逻辑与来说)
        if (cur.next != null && cur.val == cur.next.val) {
        // 说明 cur 指向的元素就是重复元素, 接下来就需要找到这个重复元素区间的末尾
        // 最终能够跳过整个重复元素的区间
        while (cur.next != null && cur.val == cur.next.val) {
        cur = cur.next;
        }
语言 方法
3139 5XV7WwkL2U
C0t57 何之舟
4602 2009-09-21 10:13:50

        // 上面的 while 循环结束, 此时 cur 就指向这片相同元素区间的最后一个位置
        // 再多走一步就意味着跳过了整个相同元素的区间
        cur = cur.next;
        } else {
        // 说明 cur 指向的元素不是重复元素
        // 把这个元素插入到新链表中
        newTail.next = new ListNode(cur.val);
        newTail = newTail.next;
        cur = cur.next;
        }
        }
        return newHead.next;
        }

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多