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

2019-01-21  本文已影响10人  北国雪WRG

在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表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;
    }
上一篇下一篇

猜你喜欢

热点阅读