您好,登錄后才能下訂單哦!
本篇內容主要講解“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進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。