给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。
LeetCode第83题 https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list/
这题非常简单,但是有细节需要注意。
首先我们的思路是让 一个结点temp 在链表中一个一个往后走,在走的过程中会有两种情况
1)temp的值等于next的值
这个时候temp.next就需要等于temp.next.next了。然后进行下一轮temp和next(这时候的next的值已经是在原链表中和temp的值隔了一个数了。)的比较了。
2)不等于
那temp.next不需要变化,只要简单让temp后移就行了。然后进行下一轮比较。
而我一开始说的细节,他就在什么时候进行这个循环这个问题上。
简单一想是当temp不等于null的时候,但是注意,我们在代码里有temp.next.next这个式子。如果单纯让temp不等于null,那当temp.next等于null时满足这个条件,但是里面会报错,因为不存在结点,那就更不存在它的next了。
那如果是temp.next!=null呢,还是会有问题,如果一开始输入的就是空null,那就同样不能进行。当然你可以在开头添加一个if语句来判断这个特殊情况,这样就能解决了。
如果我不想添加if,那还有一种方法。就是让这个条件变成“temp!=null&&temp.next!=null”这个时候,如果一开始输入的就是null,他他判断到&&时就直接跳出了,不会继续判断temp.next了。 但是同样要注意,必须temp!=null写在前面。
我就是因为这一点细节错在调试过程中疯狂报错。
代码如下:
/**
* Definition for singly-linked list.
* public class ListNode {
* public int val;
* public ListNode next;
* public ListNode(int x) { val = x; }
* }
*/
public class Solution {
public ListNode DeleteDuplicates(ListNode head) {
ListNode temp=head;
while(temp!=null&&temp.next!=null)
{
if(temp.val==temp.next.val)
temp.next=temp.next.next;
else
temp=temp.next;
}
return head;
}
}