原题链接
讨论澄清
因为本题的要求是删除重复元素,再删除的时候会出现多个重复节点删到只剩一个节点的时候,这个时候还要继续删除,但是如果不做标记的话,是没有办法说明这个节点也是重复节点的,所以需要在删除重复节点之前记录它的值。
思路简述
首先添加虚拟头结点,并且设置一个变量用于记录重复节点的值。如果该节点的值为标记的值,那么就将该节点删除,否则则将遍历指针向后移动一位。
注意事项
注意头结点可能被删的情况
具体代码
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode deleteDuplicates(ListNode head) {
//这里可能出现头节点被删除的情况,因此需要添加辅助节点
ListNode dummyhead = new ListNode();
dummyhead.next = head;
ListNode newnode = dummyhead;
//设置一个用于记录被删节点的值的数据
int n = 0;
//空节点的情况,单独处理
if(newnode.next==null){
return null;
}
while(newnode.next!=null&&newnode.next.next!=null){
if(newnode.next.val==newnode.next.next.val){
//先不进行删除,先记录值
n = newnode.next.val;
//删除到只剩一个节点
while(newnode.next!=null && newnode.next.val==n){
newnode.next=newnode.next.next;
}
}
//如果不是重复节点,则向后移位
else{
newnode = newnode.next;
}
}
return dummyhead.next;
}
}