题目
这题可谓是进阶版!不再要求我们删除指定val值的节点,而是我们去寻找链表 val值 重复的所有节点。
解题思维
反面教材(错误思维)
如果我们想采用 不带头的方式去解决非常麻烦
正确思维
创建一个 傀儡节点,与链表链接,使链表 带头。然后去判断 傀儡节点后面是否 具有 两个节点,如果有则判断一下是否两个节点之间的val 值,是否重复。如果重复,我们就将 其重复的val值,记录一下。
再接着看!假设:当前我们已经得知 当前重复节点的 val / x 值 。
此时,我们就拿着这个去遍历数组,发现有val值相同的节点,我们的cur.next 直接连走1步(删除这个节点)。
不是重复的节点就好办了,让cur,next 走一步
就算一开始就是 val值 重复的节点,也不要紧,因为那个时候 cur 还在 傀儡节点newHead那里!
或者再狠一点,整个链表的节点都删完了。无非就 cur.next == null == newHead.next。你会发现还是没有影响。
这个题目不就解决了吗?
最后附上程序
class Solution {
public ListNode deleteDuplicates(ListNode head) {
if(head == null ){
return head;
}
ListNode newHead = new ListNode();
newHead.next = head;
ListNode cur = newHead;
while(cur.next!=null && cur.next.next!=null){
if(cur.next.val == cur.next.next.val){
int x = cur.next.val;
while(cur.next!=null && cur.next.val == x){
cur.next = cur.next.next;
}
}else{
cur = cur.next;
}
}
return newHead.next;
}
}