这是我参与8月更文挑战的第3天,活动详情查看:8月更文挑战
题目描述:
83. 删除排序链表中的重复元素 - 力扣(LeetCode) (leetcode-cn.com)
存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除所有重复的元素,使每个元素 只出现一次 。
返回同样按升序排列的结果链表。
示例一
输入: head = [1,1,2]
输出: [1,2]
示例二
输入: head = [1,1,2,3,3]
输出: [1,2,3]
提示:
- 链表中节点数目在范围
[0, 300]内 -100 <= Node.val <= 100- 题目数据保证链表已经按升序排列
思路分析
一次遍历
由于题目已经说明列表是一个升序的链表,所以重复的元素肯定是连续在一起的,我们只需要遍历一遍链表就能去除重复的元素。
步骤:
- 定义一个指针cur指向head
- 比较当前节点的值和下个节点的值,
- 如果相同,cur节点指向下个节点的下个节点,这样cur的原下个节点就没有节点指向了,想当与去重了
- 如果不同,cur后移一位继续循环
AC代码
class Solution {
fun deleteDuplicates(head: ListNode?): ListNode? {
// 虚拟头结点 dummy,使其指向 head,最终返回 dummy.next。注意:-100 <= Node.val <= 100
val dummy = ListNode(-101)
dummy.next = head
var cur: ListNode? = dummy
while (cur?.next != null) {
if (cur?.`val` == cur?.next?.`val`) {
// 跳过当前的重复节点,使得cur指向当前重复元素的最后一个位置
cur?.next = cur?.next?.next
} else {
// 不重复,移到下一个位置
cur = cur?.next
}
}
return dummy.next
}
}
总结
这个就是个简单的链表的题目,循环很容易就想到了,官解也是这个。 看评论区还有个递归的,下次试试。
参考
删除排序链表中的重复元素 - 删除排序链表中的重复元素 - 力扣(LeetCode) (leetcode-cn.com)
83. 删除排序链表中的重复元素 - 删除排序链表中的重复元素 - 力扣(LeetCode) (leetcode-cn.com)