欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python無(wú)序鏈表刪除重復(fù)項(xiàng)的方法

 更新時(shí)間:2020年01月17日 14:54:20   作者:布?xì)W不歐  
這篇文章主要介紹了python無(wú)序鏈表刪除重復(fù)項(xiàng)的方法,本文給大家介紹的非常詳細(xì),具體一定的參考借鑒價(jià)值,需要的朋友可以參考下

題目描述:

給定一個(gè)沒(méi)有排序的鏈表,去掉重復(fù)項(xiàng),并保留原順序 如: 1->3->1->5->5->7,去掉重復(fù)項(xiàng)后變?yōu)椋?->3->5->7

方法:

  1. 順序刪除
  2. 遞歸刪除

1.順序刪除

由于這種方法采用雙重循環(huán)對(duì)鏈表進(jìn)行遍歷,因此,時(shí)間復(fù)雜度為O(n**2)
在遍歷鏈表的過(guò)程中,使用了常數(shù)個(gè)額外的指針變量來(lái)保存當(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):
  """
  對(duì)帶頭結(jié)點(diǎn)的無(wú)序單鏈表刪除重復(fù)的結(jié)點(diǎn)
  順序刪除:通過(guò)雙重循環(huán)直接在鏈表上進(jìn)行刪除操作
  即,外層循環(huán)用一個(gè)指針從第一個(gè)結(jié)點(diǎn)開(kāi)始遍歷整個(gè)鏈表,內(nèi)層循環(huán)從外層指針指向的下一個(gè)結(jié)點(diǎn)開(kāi)始,
  遍歷其余結(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.遞歸

此方法與方法一類(lèi)似,從本質(zhì)上而言,由于這種方法需要對(duì)鏈表進(jìn)行雙重遍歷,所以時(shí)間復(fù)雜度為O(n**2)
由于遞歸法會(huì)增加許多額外的函數(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):
  """
  遞歸法:將問(wèn)題逐步分解為小問(wèn)題,即,對(duì)于結(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):
  """
  對(duì)帶頭結(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)

上述介紹的方法也適用于鏈表有序的情況,但是由于上述方法沒(méi)有充分利用到鏈表有序這個(gè)條件,因此,算法的性能肯定不是最優(yōu)的。本題中,由于鏈表具有有序性,因此不需要對(duì)鏈表進(jìn)行兩次遍歷。所以有如下思路:
用cur指向鏈表的第一個(gè)結(jié)點(diǎn),此時(shí)需要分為以下兩種情況討論:

  • 如果cur.data == cur.next.data,則刪除cur.next結(jié)點(diǎn);
  • 如果cur.data != cur.next.data,則cur=cur.next,繼續(xù)遍歷其余結(jié)點(diǎn);

總結(jié)

以上所述是小編給大家介紹的python無(wú)序鏈表刪除重復(fù)項(xiàng)的方法,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
如果你覺(jué)得本文對(duì)你有幫助,歡迎轉(zhuǎn)載,煩請(qǐng)注明出處,謝謝!

相關(guān)文章

  • Python使用gensim計(jì)算文檔相似性

    Python使用gensim計(jì)算文檔相似性

    在文本處理中,比如商品評(píng)論挖掘,有時(shí)需要了解每個(gè)評(píng)論分別和商品的描述之間的相似度,以此衡量評(píng)論的客觀性。那么python 里面有計(jì)算文本相似度的程序包嗎,恭喜你,不僅有,而且很好很強(qiáng)大。下面我們就來(lái)體驗(yàn)下gensim的強(qiáng)大
    2016-04-04
  • 如何用Python繪制簡(jiǎn)易動(dòng)態(tài)圣誕樹(shù)

    如何用Python繪制簡(jiǎn)易動(dòng)態(tài)圣誕樹(shù)

    這篇文章主要給大家介紹了關(guān)于如何用Python繪制簡(jiǎn)易動(dòng)態(tài)圣誕樹(shù),文中講解了如何通過(guò)編寫(xiě)代碼來(lái)實(shí)現(xiàn)特定的效果,包括代碼的編寫(xiě)技巧和效果的展示,需要的朋友可以參考下
    2025-01-01
  • Python屏幕抓取和錄制的詳細(xì)代碼示例

    Python屏幕抓取和錄制的詳細(xì)代碼示例

    隨著現(xiàn)代計(jì)算機(jī)性能的提高和網(wǎng)絡(luò)速度的加快,越來(lái)越多的用戶(hù)需要對(duì)他們的屏幕進(jìn)行錄制,這篇文章主要介紹了Python屏幕抓取和錄制的相關(guān)資料,需要的朋友可以參考下
    2025-09-09
  • Python Excel 通用篩選函數(shù)的實(shí)現(xiàn)

    Python Excel 通用篩選函數(shù)的實(shí)現(xiàn)

    本文主要介紹了Python Excel 通用篩選函數(shù)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-08-08
  • 基于PyQt5實(shí)現(xiàn)一個(gè)串口接數(shù)據(jù)波形顯示工具

    基于PyQt5實(shí)現(xiàn)一個(gè)串口接數(shù)據(jù)波形顯示工具

    這篇文章主要為大家詳細(xì)介紹了如何利用PyQt5實(shí)現(xiàn)一個(gè)串口接數(shù)據(jù)波形顯示工具,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下
    2023-01-01
  • 通過(guò)Python編程將CSV文件導(dǎo)出為PDF文件的方法

    通過(guò)Python編程將CSV文件導(dǎo)出為PDF文件的方法

    CSV文件通常用于存儲(chǔ)大量的數(shù)據(jù),而PDF文件則是一種通用的文檔格式,便于與他人共享和打印,將CSV文件轉(zhuǎn)換成PDF文件可以幫助我們更好地管理和展示數(shù)據(jù),本文將介紹如何通過(guò)Python編程將CSV文件導(dǎo)出為PDF文件,需要的朋友可以參考下
    2024-06-06
  • 在Python的Django框架中為代碼添加注釋的方法

    在Python的Django框架中為代碼添加注釋的方法

    這篇文章主要介紹了在Python的Django框架中為代碼添加注釋的方法,需要的朋友可以參考下
    2015-07-07
  • Python基礎(chǔ)教程之輸入輸出和運(yùn)算符

    Python基礎(chǔ)教程之輸入輸出和運(yùn)算符

    這篇文章主要給大家介紹了關(guān)于Python基礎(chǔ)教程之輸入輸出和運(yùn)算符的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用Python具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • python request post 列表的方法詳解

    python request post 列表的方法詳解

    這篇文章主要介紹了python request post 列表的方法詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • pycharm運(yùn)行程序時(shí)看不到任何結(jié)果顯示的解決

    pycharm運(yùn)行程序時(shí)看不到任何結(jié)果顯示的解決

    今天小編就為大家分享一篇pycharm運(yùn)行程序時(shí)看不到任何結(jié)果顯示的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-02-02

最新評(píng)論