国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

腳本之家,腳本語言編程技術(shù)及教程分享平臺!
分類導(dǎo)航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務(wù)器之家 - 腳本之家 - Python - python無序鏈表刪除重復(fù)項(xiàng)的方法

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

2020-04-17 09:57布?xì)W不歐 Python

這篇文章主要介紹了python無序鏈表刪除重復(fù)項(xiàng)的方法,本文給大家介紹的非常詳細(xì),具體一定的參考借鑒價(jià)值,需要的朋友可以參考下

題目描述:

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

方法:

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

1.順序刪除

由于這種方法采用雙重循環(huán)對鏈表進(jìn)行遍歷,因此,時(shí)間復(fù)雜度為O(n**2)
在遍歷鏈表的過程中,使用了常數(shù)個(gè)額外的指針變量來保存當(dāng)前遍歷的結(jié)點(diǎn),前驅(qū)結(jié)點(diǎn)和被刪除的結(jié)點(diǎn),所以空間復(fù)雜度為O(1)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#!/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)用一個(gè)指針從第一個(gè)結(jié)點(diǎn)開始遍歷整個(gè)鏈表,內(nèi)層循環(huán)從外層指針指向的下一個(gè)結(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é)果:

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

2.遞歸

此方法與方法一類似,從本質(zhì)上而言,由于這種方法需要對鏈表進(jìn)行雙重遍歷,所以時(shí)間復(fù)雜度為O(n**2)
由于遞歸法會增加許多額外的函數(shù)調(diào)用,所以從理論上講,該方法效率比方法一低

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#!/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é)果:

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

引申:從有序鏈表中刪除重復(fù)項(xiàng)

上述介紹的方法也適用于鏈表有序的情況,但是由于上述方法沒有充分利用到鏈表有序這個(gè)條件,因此,算法的性能肯定不是最優(yōu)的。本題中,由于鏈表具有有序性,因此不需要對鏈表進(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無序鏈表刪除重復(fù)項(xiàng)的方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時(shí)回復(fù)大家的。在此也非常感謝大家對服務(wù)器之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!

原文鏈接:https://blog.csdn.net/weixin_44321080/article/details/103996333

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 久久精品一区 | 一区二区三区四区免费看 | 国产精品一卡二卡 | 精品亚洲一区二区 | 国产欧美日韩视频 | 日韩免费在线观看 | 肌肉男gay网站 | 精品欧美乱码久久久久久1区2区 | 欧美日日 | 国产一区二区三区 | 亚洲国产成人av好男人在线观看 | 久久男人天堂 | 亚洲人视频在线观看 | 亚洲国产传媒99综合 | 久久中文字幕一区二区三区 | 中文字幕在线免费看 | 国产一区二区三区高清 | 亚洲国产精品一区二区第一页 | 欧美一区二区三区在线观看视频 | 色九九| 亚洲精品在线观看av | 黄色网址在线免费 | 日韩欧美一区二区在线视频 | 一级电影免费看 | 激情综合色综合久久综合 | 亚洲欧美视频 | 欧美精品一区二区三区蜜桃视频 | 国产精品不卡在线播放 | 激情久久免费视频 | 国内精品久久久 | 欧美日韩综合在线 | 综合av在线| 成人久久久久久 | 国产在线一区二区三区 | 欧美v片| 亚洲精品影视 | av网址在线播放 | 中文字幕在线观看一区 | 日韩精品在线一区二区 | 在线观看日韩精品 | 欧美成人综合在线 |