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

python無序鏈表刪除重復(fù)項的方法

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

題目描述:

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

方法:

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

1.順序刪除

由于這種方法采用雙重循環(huán)對鏈表進行遍歷,因此,時間復(fù)雜度為O(n**2)
在遍歷鏈表的過程中,使用了常數(shù)個額外的指針變量來保存當前遍歷的結(jié)點,前驅(qū)結(jié)點和被刪除的結(jié)點,所以空間復(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é)點的無序單鏈表刪除重復(fù)的結(jié)點
  順序刪除:通過雙重循環(huán)直接在鏈表上進行刪除操作
  即,外層循環(huán)用一個指針從第一個結(jié)點開始遍歷整個鏈表,內(nèi)層循環(huán)從外層指針指向的下一個結(jié)點開始,
  遍歷其余結(jié)點,將與外層循環(huán)遍歷到的的指針所指的結(jié)點的數(shù)據(jù)域相同的結(jié)點刪除
  :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ì)上而言,由于這種方法需要對鏈表進行雙重遍歷,所以時間復(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é)點cur,首先遞歸地刪除以cur.next為首
  的子鏈表中重復(fù)的結(jié)點;接著刪除以cur為首的鏈表中的重復(fù)結(jié)點,
  :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é)點的單鏈表刪除重復(fù)結(jié)點
  :param head: 鏈表頭結(jié)點
  :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ù)項

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

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

總結(jié)

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

相關(guān)文章

  • python多進程實現(xiàn)進程間通信實例

    python多進程實現(xiàn)進程間通信實例

    這篇文章主要介紹了python多進程實現(xiàn)進程間通信實例,具有一定參考價值,需要的朋友可以了解下。
    2017-11-11
  • Flask Paginate實現(xiàn)表格分頁的使用示例

    Flask Paginate實現(xiàn)表格分頁的使用示例

    flask_paginate是Flask框架的一個分頁擴展,用于處理分頁相關(guān)的功能,本文就來介紹一下Flask Paginate實現(xiàn)表格分頁的使用示例,感興趣的可以了解一下
    2023-11-11
  • python?pygame實現(xiàn)控制物體移動

    python?pygame實現(xiàn)控制物體移動

    這篇文章主要為大家詳細介紹了python?pygame控制物體移動,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Python類的定義和使用詳情

    Python類的定義和使用詳情

    這篇文章主要介紹了Python類的定義和使用詳情,在Python中,類表示具有相同屬性和方法的對象的集合,文章圍繞主題相關(guān)資料展開更多的相關(guān)介紹,需要的小伙伴可以參考一下
    2022-06-06
  • python自動結(jié)束mysql慢查詢會話的實例代碼

    python自動結(jié)束mysql慢查詢會話的實例代碼

    這篇文章主要介紹了python自動結(jié)束mysql慢查詢會話,主要涉及到了mysql慢查詢會話查詢,定時任務(wù)的相關(guān)知識,本文通過實例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2019-10-10
  • python交互界面的退出方法

    python交互界面的退出方法

    今天小編就為大家分享一篇python交互界面的退出方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-02-02
  • Python實現(xiàn)用networkx繪制MultiDiGraph

    Python實現(xiàn)用networkx繪制MultiDiGraph

    這篇文章主要介紹了Python實現(xiàn)用networkx繪制MultiDiGraph方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • Python目錄下文件讀取方式

    Python目錄下文件讀取方式

    這篇文章主要介紹了Python目錄下文件讀取方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • Python如何識別銀行卡卡號?

    Python如何識別銀行卡卡號?

    今天給大家?guī)淼氖怯嘘P(guān)Python的相關(guān)知識,文章圍繞著Python如何識別銀行卡卡號展開,文中有非常詳細的代碼示例及介紹,需要的朋友可以參考下
    2021-06-06
  • 實踐Vim配置python開發(fā)環(huán)境

    實踐Vim配置python開發(fā)環(huán)境

    這篇文章給大家分享了Vim配置python開發(fā)環(huán)境的實踐心得,大家可以跟著嘗試操作下。
    2018-07-07

最新評論