美文网首页
删除链表中重复的节点(剑指offer 面试题57)

删除链表中重复的节点(剑指offer 面试题57)

作者: 抬头挺胸才算活着 | 来源:发表于2020-03-10 17:58 被阅读0次

看似简单,写起来还是有点费劲的
preNotRepeatNode存放的是前一个不重复的节点
n1n2是在遍历的过程的前后节点
last是在检测到重复的情况下的最后一个节点


    public static LinkedListNode deleteRepeatNodes(LinkedListNode head){
        if(head==null || head.next == null)
            return null;

        LinkedListNode n1 = head;
        LinkedListNode n2 = n1.next;
        LinkedListNode preNotRepeatNode = null;
        LinkedListNode newHead = null;

        while(n2!=null){
            if(n1.value==n2.value){
//                LinkedListNode start = n1;
                LinkedListNode last = n2;
                while(true){
                    if(last.next==null||last.next.value!=last.value)
                        break;

                    last = last.next;
                }

                if(preNotRepeatNode!=null){
                    preNotRepeatNode.next = last.next;
                }

                n1 = last.next;
                last.next = null;

                if(n1==null){
                    return newHead;
                }else{
                    n2 = n1.next;
                }
            }else{
                preNotRepeatNode = n1;
                if(newHead==null){
                    newHead = preNotRepeatNode;
                }
                n1 = n2;
                n2 = n1.next;
            }
        }

        return newHead;
    }

测试代码:

//        LinkedListNode list = new LinkedListNode(1, null);
//        list = new LinkedListNode(1, list);
//        list = new LinkedListNode(1, list);
//        list = new LinkedListNode(1, list);
//        list = new LinkedListNode(1, list);
//        list = new LinkedListNode(1, list);
//        list = new LinkedListNode(1, list);
//
//        LinkedListNode newList = LinkedListNode.deleteRepeatNodes(list);
//        LinkedListNode.traversal(newList);

        LinkedListNode list = new LinkedListNode(5, null);
        list = new LinkedListNode(4, list);
        list = new LinkedListNode(4, list);
        list = new LinkedListNode(3, list);
        list = new LinkedListNode(3, list);
        list = new LinkedListNode(2, list);
        list = new LinkedListNode(1, list);

        LinkedListNode newList = LinkedListNode.deleteRepeatNodes(list);
        LinkedListNode.traversal(newList);

相关文章

网友评论

      本文标题:删除链表中重复的节点(剑指offer 面试题57)

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