python無序鏈表刪除重復(fù)項(xiàng)的方法
題目描述:
給定一個沒有排序的鏈表,去掉重復(fù)項(xiàng),并保留原順序 如: 1->3->1->5->5->7,去掉重復(fù)項(xiàng)后變?yōu)椋?->3->5->7
方法:
- 順序刪除
- 遞歸刪除
1.順序刪除
由于這種方法采用雙重循環(huán)對鏈表進(jìn)行遍歷,因此,時間復(fù)雜度為O(n**2)
在遍歷鏈表的過程中,使用了常數(shù)個額外的指針變量來保存當(dāng)前遍歷的結(jié)點(diǎn),前驅(qū)結(jié)點(diǎn)和被刪除的結(jié)點(diǎn),所以空間復(fù)雜度為O(1)
#!/usr/bin/env python3 # -*- coding: utf-8 -*- # @Time : 2020/1/15 20:55 # @Author : buu # @Software: PyCharm # @Blog :https://blog.csdn.net/weixin_44321080 class LNode: def __init__(self, x): self.data = x self.next = None def removeDup(head): """ 對帶頭結(jié)點(diǎn)的無序單鏈表刪除重復(fù)的結(jié)點(diǎn) 順序刪除:通過雙重循環(huán)直接在鏈表上進(jìn)行刪除操作 即,外層循環(huán)用一個指針從第一個結(jié)點(diǎn)開始遍歷整個鏈表,內(nèi)層循環(huán)從外層指針指向的下一個結(jié)點(diǎn)開始, 遍歷其余結(jié)點(diǎn),將與外層循環(huán)遍歷到的的指針?biāo)傅慕Y(jié)點(diǎn)的數(shù)據(jù)域相同的結(jié)點(diǎn)刪除 :param head: 頭指針 :return: """ if head is None or head.next is None: return outerCur = head.next innerCur = None innerPre = None while outerCur is not None: innerCur = outerCur.next innerPre = outerCur while innerCur is not None: if outerCur.data == innerCur.data: innerPre.next = innerCur.next innerCur = innerCur.next else: innerPre = innerCur innerCur = innerCur.next outerCur = outerCur.next if __name__ == '__main__': i = 1 head = LNode(6) tmp = None cur = head while i < 7: if i % 2 == 0: tmp = LNode(i + 1) elif i % 3 == 0: tmp = LNode(i - 2) else: tmp = LNode(i) cur.next = tmp cur = tmp i += 1 print("before removeDup:") cur = head.next while cur is not None: print(cur.data, end=' ') cur = cur.next removeDup(head) print("\nafter removeDup:") cur = head.next while cur is not None: print(cur.data, end=' ') cur = cur.next
結(jié)果:
2.遞歸
此方法與方法一類似,從本質(zhì)上而言,由于這種方法需要對鏈表進(jìn)行雙重遍歷,所以時間復(fù)雜度為O(n**2)
由于遞歸法會增加許多額外的函數(shù)調(diào)用,所以從理論上講,該方法效率比方法一低
#!/usr/bin/env python3 # -*- coding: utf-8 -*- # @Time : 2020/1/15 21:30 # @Author : buu # @Software: PyCharm # @Blog :https://blog.csdn.net/weixin_44321080 class LNode: def __init__(self, x): self.data = x self.next = None def removeDupRecursion(head): """ 遞歸法:將問題逐步分解為小問題,即,對于結(jié)點(diǎn)cur,首先遞歸地刪除以cur.next為首 的子鏈表中重復(fù)的結(jié)點(diǎn);接著刪除以cur為首的鏈表中的重復(fù)結(jié)點(diǎn), :param head: :return: """ if head.next is None: return head pointer = None cur = head head.next = removeDupRecursion(head.next) pointer = head.next while pointer is not None: if head.data == pointer.data: cur.next = pointer.next pointer = cur.next else: pointer = pointer.next cur = cur.next return head def removeDup(head): """ 對帶頭結(jié)點(diǎn)的單鏈表刪除重復(fù)結(jié)點(diǎn) :param head: 鏈表頭結(jié)點(diǎn) :return: """ if head is None: return head.next = removeDupRecursion(head.next) if __name__ == '__main__': i = 1 head = LNode(6) tmp = None cur = head while i < 7: if i % 2 == 0: tmp = LNode(i + 1) elif i % 3 == 0: tmp = LNode(i - 2) else: tmp = LNode(i) cur.next = tmp cur = tmp i += 1 print("before recursive removeDup:") cur = head.next while cur is not None: print(cur.data, end=' ') cur = cur.next removeDup(head) print("\nafter recurseve removeDup:") cur = head.next while cur is not None: print(cur.data, end=' ') cur = cur.next
結(jié)果:
引申:從有序鏈表中刪除重復(fù)項(xiàng)
上述介紹的方法也適用于鏈表有序的情況,但是由于上述方法沒有充分利用到鏈表有序這個條件,因此,算法的性能肯定不是最優(yōu)的。本題中,由于鏈表具有有序性,因此不需要對鏈表進(jìn)行兩次遍歷。所以有如下思路:
用cur指向鏈表的第一個結(jié)點(diǎn),此時需要分為以下兩種情況討論:
- 如果cur.data == cur.next.data,則刪除cur.next結(jié)點(diǎn);
- 如果cur.data != cur.next.data,則cur=cur.next,繼續(xù)遍歷其余結(jié)點(diǎn);
總結(jié)
以上所述是小編給大家介紹的python無序鏈表刪除重復(fù)項(xiàng)的方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!
相關(guān)文章
python多進(jìn)程實(shí)現(xiàn)進(jìn)程間通信實(shí)例
這篇文章主要介紹了python多進(jìn)程實(shí)現(xiàn)進(jìn)程間通信實(shí)例,具有一定參考價值,需要的朋友可以了解下。2017-11-11Flask Paginate實(shí)現(xiàn)表格分頁的使用示例
flask_paginate是Flask框架的一個分頁擴(kuò)展,用于處理分頁相關(guān)的功能,本文就來介紹一下Flask Paginate實(shí)現(xiàn)表格分頁的使用示例,感興趣的可以了解一下2023-11-11python?pygame實(shí)現(xiàn)控制物體移動
這篇文章主要為大家詳細(xì)介紹了python?pygame控制物體移動,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-01-01python自動結(jié)束mysql慢查詢會話的實(shí)例代碼
這篇文章主要介紹了python自動結(jié)束mysql慢查詢會話,主要涉及到了mysql慢查詢會話查詢,定時任務(wù)的相關(guān)知識,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2019-10-10Python實(shí)現(xiàn)用networkx繪制MultiDiGraph
這篇文章主要介紹了Python實(shí)現(xiàn)用networkx繪制MultiDiGraph方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-02-02實(shí)踐Vim配置python開發(fā)環(huán)境
這篇文章給大家分享了Vim配置python開發(fā)環(huán)境的實(shí)踐心得,大家可以跟著嘗試操作下。2018-07-07