题目:
给定一个已排序的链表的头 head
, 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。
提示:
- 链表中节点数目在范围
[0, 300]
内 -100 <= Node.val <= 100
- 题目数据保证链表已经按升序 排列
解法:
先理清思路:
- 已经知道这个链表的升序排序了,所以我们可以一个个检查下去,有一样的就舍弃掉。
- 我们用一个指针 current 来遍历链表。
- 如果当前 current 与 current.next 对应的元素相同,我们就将current.next 指针指向 current.next.next
- 否则,说明链表中 current 对应的元素是没有重复的,因此可以将 current 指针移动到下一个节点。
- 遍历结束后,返回链表的头节点即可。
代码实现:
class Solution {public ListNode deleteDuplicates(ListNode head) {// 用current遍历,保留headListNode current = head;while(current != null && current.next != null){if(current.val == current.next.val){current.next = current.next.next; // 跳过重复的节点}else{current = current.next; // 移动到下一个节点}}return head; // head 始终指向链表的头部,返回原始头节点}
}
细节注意:
遍历链表时为什么需要新定义一个current?不能直接使用head?-----因为直接使用head去遍历会导致直接修改head,后面的head指针也会不断后移,最终返回的不是原始链表的头节点了,而是链表最后一个节点(或null)。
正确做法:应该用一个 current
指针遍历链表,而保持 head
不变,始终指向链表的头部,最后返回 head
。
时间复杂度:O(n)(只需遍历一次链表)。
空间复杂度:O(1)(只用了额外指针 current
)。