原题链接

讨论澄清

因为本题的要求是删除重复元素,再删除的时候会出现多个重复节点删到只剩一个节点的时候,这个时候还要继续删除,但是如果不做标记的话,是没有办法说明这个节点也是重复节点的,所以需要在删除重复节点之前记录它的值。

思路简述

首先添加虚拟头结点,并且设置一个变量用于记录重复节点的值。如果该节点的值为标记的值,那么就将该节点删除,否则则将遍历指针向后移动一位。

注意事项

注意头结点可能被删的情况

具体代码

  1. /**
  2. * Definition for singly-linked list.
  3. * public class ListNode {
  4. * int val;
  5. * ListNode next;
  6. * ListNode() {}
  7. * ListNode(int val) { this.val = val; }
  8. * ListNode(int val, ListNode next) { this.val = val; this.next = next; }
  9. * }
  10. */
  11. class Solution {
  12. public ListNode deleteDuplicates(ListNode head) {
  13. //这里可能出现头节点被删除的情况,因此需要添加辅助节点
  14. ListNode dummyhead = new ListNode();
  15. dummyhead.next = head;
  16. ListNode newnode = dummyhead;
  17. //设置一个用于记录被删节点的值的数据
  18. int n = 0;
  19. //空节点的情况,单独处理
  20. if(newnode.next==null){
  21. return null;
  22. }
  23. while(newnode.next!=null&&newnode.next.next!=null){
  24. if(newnode.next.val==newnode.next.next.val){
  25. //先不进行删除,先记录值
  26. n = newnode.next.val;
  27. //删除到只剩一个节点
  28. while(newnode.next!=null && newnode.next.val==n){
  29. newnode.next=newnode.next.next;
  30. }
  31. }
  32. //如果不是重复节点,则向后移位
  33. else{
  34. newnode = newnode.next;
  35. }
  36. }
  37. return dummyhead.next;
  38. }
  39. }