MS的一个面试题,删除链表中连续重复的节点,如1,2,2,2,1,4,1,4——》4,14
O(N)的时间复杂度,需要借助一个栈
public Node deleteDup(Node head){
if(head == null) return null;
Node pre = new Node(0);
pre.next = head;
head = pre;
Node p = head.next;
Stack<Node> s = new Stack<Node>();
s.push(head);
while(p != null){
pre = s.peek();
p = pre.next;
if(pre == head || pre.val != p.val){
s.push(p);
}
else{//当需要进行删除的时候改变栈顶元素的next指针
while(p != null && p.val == pre.val){//找到和栈顶元素不同的节点
p = p.next;
}
s.pop();//删除栈顶元素
pre = s.peek();//重置新栈顶元素的next指针
pre.next = p;
}
}
return head.next;
}