算法:
核心点在于如何找到重复节点,有序链表的话,只要下一个节点与当前节点数值一样就是重复节点,直接将当前节点指向下一个节点的下一个节点即可。
本算法需要注意哨兵节点的小技巧。
题目1:删除排序链表中的重复元素 https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list/submissions/
代码实现:
/** * Definition for singly-linked list. * type ListNode struct { * Val int * Next *ListNode * } */ func deleteDuplicates(head *ListNode) *ListNode { curr := head for curr != nil && curr.Next != nil { if curr.Val == curr.Next.Val { // 删除重复节点,node tmp := curr.Next curr.Next = tmp.Next } else { // 不是重复节点的话,移动节点 curr = curr.Next } } return head }
执行结果:
题目2: 删除排序链表中的重复元素
代码实现
// 算法:与题目1的不同之处在于,本题目是删除所有重复的节点, // 也就是说不单单要找到重复节点的位置, // 还需要将第一个重复节点的前一个节点记录下来,这里叫做pre // 然后通过pre.Next去指向重复节点的后面哪一个不重复的节点,来完成删除。 // 涉及到前序节点pre,就需要考虑哨兵节点。 /** * Definition for singly-linked list. * type ListNode struct { * Val int * Next *ListNode * } */ func deleteDuplicates(head *ListNode) *ListNode { if head == nil || head.Next == nil { return head } n := new(ListNode) // 设置钩子节点,避免头节点都被删除不好操作 n.Next = head pre := n for pre != nil { // pre是当前节点的前一个节点 if pre.Next == nil { break } curr := pre.Next next := curr.Next for next != nil { // 比较重复的节点 if next.Val != curr.Val { break } next = next.Next } if curr.Next == next { pre = pre.Next } else { // 重复的,删除重复节点 pre.Next = next } } return n.Next }
执行结果:
本文分享自微信公众号 - 灰子学技术(huizixueguoxue),作者:灰子学技术
原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。
原始发表时间:2020-08-01
本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。
我来说两句