本篇内容主要讲解“c++如何删除链表中重复节点”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“c++如何删除链表中重复节点”吧!
算法:
核心点在于如何找到重复节点,有序链表的话,只要下一个节点与当前节点数值一样就是重复节点,直接将当前节点指向下一个节点的下一个节点即可。
题目1:删除排序链表中的重复元素
代码实现:
/** * 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
}
到此,相信大家对“c++如何删除链表中重复节点”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。