剑指offer----删除链表中重复的节点

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

public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }

我自己的解

public class Solution {
    public ListNode deleteDuplication(ListNode pHead)
    {
        if(pHead == null || pHead.next == null){
            return pHead;
        }
        ListNode temp = new ListNode(Integer.MIN_VALUE);
        temp.next = pHead;
        ListNode first = pHead;
        ListNode second = temp;
        while(first != null && first.next != null){
            if(second.next.val == first.next.val){
                first = first.next;
                if((first.next == null) || second.next.val != first.next.val){
                    first = first.next;
                    second.next = first;
                }
            }else{
                first = first.next;
                second= second.next;
            }
        }
        return temp.next;
    }
}

这个是一步一步按我的想法推出来的,并且根据测试用例不断的调整出来的,所以代码看起来比较丑,有空我会把整理之后的代码也贴上来。
一开始我想通过来个指针来实现,一个指针用来记录上一个非重复节点,设为second,一个指针不断的向前移动,设会frist,当first的下一个节点和second的下一个节点一样时,说明有重复节点,然后first不断向后移动,直到first的下一个节点与second的下一个节点不等,然后更新second的next节点。
后来发现,如果是链表的第一个节点就是重复节点的话,如果将second仍初始化在头节点的话,是不容易将其删去的,所以加了一个节点放在头结点的前面表示第一个重复节点,返回时只需要将该节点的下一个节点return即可。

有几个需要注意的点

  1. while的判断条件为first != null && first.next != null ,其中
  • first.next != null 是我在判断是否是重复节点的时候,会使用next.val所以next是不能为空的,如果next是空的,调用val就会报错
  • first != null 是在发现重复节点,并且去除重复节点,将first和second连接的时候,我的first在本次while循环中走了两步,有可能此时first已经走到了最后一个节点的后面。所以这个时候我就可以停止循环了,这个判断条件也可以改到下面注释中所示的位置
if((first.next == null) || second.next.val != first.next.val){//①
                    first = first.next;
                    second.next = first;
                    //if(first == null) break;
                }
  1. 还有上面①所示的位置的判断条件,由于当first.next为空的时候,就不能比较他们两个的值了,但是此时也是默认second.next和first.next的值不等的,所以需要将他加上

下面这个代码和上面的思路一样,只不过把一些东西抽离出来了,方便理解。

public class Solution {
    public ListNode deleteDuplication(ListNode pHead)
    {
        if(pHead == null || pHead.next == null){
            return pHead;
        }
        ListNode temp = new ListNode(Integer.MIN_VALUE);
        temp.next = pHead;
        ListNode first = pHead;
        ListNode last = temp;
        while(first.next != null){
            if(last.next.val == first.next.val){
                first = first.next;
                if(first.next == null){
                    last.next = null;
                    break;
                }
                if(last.next.val != first.next.val){
                    first = first.next;
                    last.next = first;
                }
            }else{
                first = first.next;
                last = last.next;
            }
        }
        return temp.next;
    }
}

你可能感兴趣的:(剑指offer----删除链表中重复的节点)