原题链接
讨论澄清
因为本题的要求是删除重复元素,再删除的时候会出现多个重复节点删到只剩一个节点的时候,这个时候还要继续删除,但是如果不做标记的话,是没有办法说明这个节点也是重复节点的,所以需要在删除重复节点之前记录它的值。
思路简述
首先添加虚拟头结点,并且设置一个变量用于记录重复节点的值。如果该节点的值为标记的值,那么就将该节点删除,否则则将遍历指针向后移动一位。
注意事项
注意头结点可能被删的情况
具体代码
/*** 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;}}
