美文网首页程序员
剑指offer----删除链表中重复的节点

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

作者: qming_c | 来源:发表于2018-02-01 13:50 被阅读0次

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

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