看似简单,写起来还是有点费劲的
preNotRepeatNode
存放的是前一个不重复的节点
n1
和n2
是在遍历的过程的前后节点
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);
网友评论