美文网首页
剑指Offer56 删除链表重复节点(链表多指针遍历)

剑指Offer56 删除链表重复节点(链表多指针遍历)

作者: 北国雪WRG | 来源:发表于2019-01-21 14:52 被阅读10次

    在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5

    这一题的难点在于:

    1. 重复的节点一个都不保留,这意味检查该节点是否为重复节点,需要保留其父亲节点。
    2. 如果重复节点出现在头部,那么需要单独处理
    3. 如果重复节点出现在尾部,那么尾部指针需要设置为null

    其实对于修改链表节点指针问题,例如列表的逆序,我们需要注意的也是这几点。

        public ListNode deleteDuplication(ListNode pHead){
            if(pHead == null) return null;
            ListNode root = null;
            ListNode end = null;
            // 双指针遍历
            ListNode p1 = pHead; // 
            ListNode p2 = pHead.next; // 
            
            while(true){
                // 遇到了重复节点,p2 指向下一个节点
                if(p2 != null && p2.val == p1.val) {
                    p2 = p2.next;
                }else{// p1 和 p2 不同值
                    // p1 和 p2 是连续节点
                    if(p1.next == p2){
                        if(root == null) {
                            root = p1; // 初始化根节点
                            end = root;
                        }else{
                            end.next = p1; // 设置end节点
                            end = p1;
                        }
                    }
                    if(p2 == null) break; // 遍历结束
                    p1 = p2;
                    p2 = p2.next;
                }
            }
            if(end != null) end.next = null; // 记得设置end节点的next指针
            return root;
        }
    

    相关文章

      网友评论

          本文标题:剑指Offer56 删除链表重复节点(链表多指针遍历)

          本文链接:https://www.haomeiwen.com/subject/jsecjqtx.html