题目:删除排序链表中的重复元素
给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。
示例 1:
输入: 1->1->2
输出: 1->2
示例 2:
输入: 1->1->2->3->3
输出: 1->2->3
思路
从头开始遍历链表,若当前节点的值等于当前节点的下一个节点的值,将当前节点的next指向当前节点的下一个节点的下一个节点,即当前节点.next不再指向它的下一个节点,而是指向下个节点的下一个节点。
class Solution {
public ListNode deleteDuplicates(ListNode head) {
ListNode curr = head;
while(curr != null && curr.next != null) {
if(curr.val == curr.next.val) {
curr.next = curr.next.next;
}else {
curr = curr.next;
}
}
return head;
}
}
时间复杂度:O(n)
空间复杂度:O(1)
细节(错了)
尾部的重复节点数量存在单数和双数的情况:
单数情况:curr.next会指向该节点,该节点的下一个为NUll,所以while判断要加上curr.next != null, 否则进入循环后:curr = curr.next指向null的话,curr.val会报错。
双数情况:curr.next指向NUll,while判断要加上curr != null,否则进入循环判断:curr.val == curr.next.val ,curr.next.val会报错。
因为这里要取出节点的值,所以要注意,不然报错。
细节()
不是双数,单数的问题,你要去curr和curr.next的值,就必须判断curr != null && curr.next != null,要一直比较curr.val == curr.next.val,不一样,就next往后移动一位,再让curr和curr.next做比较,当curr.next==null时,就退出了。
if(curr.val == curr.next.val) {
curr.next = curr.next.next;
}
出错点
当curr.val和cur.next.val相等的情况下,仅仅是将curr.next指向curr.next.next,重新指向后,curr的位置是不变的。
这种情况:
输入:
111
输出:
1
出现了重复元素,curr应该停留在原地,直到遇到curr.val != curr.next.val的情况,才让curr向后移动。
if(curr.val == curr.next.val) {
curr.next = curr.next.next;
}