这道题虽然是简单题,但是有些启发价值的。他的解法和第203题非常类似,唯一区别在于没有用dummyHead。
- 排除linked list为空或者只有一个node的两种corner cases。
- 再设置两个prev和curr两个指针分别指向head和head.next。
- 当curr不为空时:如果curr.val == prev.val, 则perv.next = curr.next; 否则 prev = curr; 两种情况都需要curr = curr.next。
我自己的理解是prev的物理意义是无重复val的子list的最后一个node,而curr的物理意义是我们目前正在探索的node。因为整个list是升序的,所以curr的值只可能和prev相等。如果这样的话就要跳过curr,但是prev要守住自己的物理意义,因此prev不能动,但是prev.next指向curr.next;如果curr的值和prev不相等,那么就可以移动prev到curr的位置。无论哪种情况,我们都需要移动curr去探索下一个node。
这道题和82题虽然类似,但是不需要加fake head,我个人觉得原因在于这道题要求每个数只能出现一次,所以head必然可以被保留下来。而上一道题却要求我们去掉重复的数字,一个不留,所以head自身难保。为此我们需要一个fake head来辅助操作。代码如下:
/**
* 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) {
if(head == null || head.next == null){
return head;
}
ListNode prev = head;
ListNode curr = head.next;
while(curr != null){
if(curr.val == prev.val){
prev.next = curr.next;
}else{
prev = curr;
}
curr = curr.next;
}
return head;
}
}