日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

玩转单链表

發(fā)布時間:2024/4/17 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 玩转单链表 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

玩指針是許多算法的精髓,就是要像六脈神劍一樣,指針亂指一通之后,內存中的數據變得井然有序。

操作指針真的是太好玩了。下面出幾道題。

一、不用額外空間翻轉單鏈表

給定一個單鏈表,要求翻轉之。

import random""" O(1)空間復雜度翻轉鏈表 方法:one->two->three 三元組構成一個窗口,每次都翻轉窗口內的元素,然后將 窗口從左往右滑動 """list_length = 4class Node:def __init__(self, value, nex):self.value = valueself.next = nexdef generate_list():a = Node(0, None)now = afor i in range(list_length):x = Node(random.randint(0, 100), None)now.next = xnow = xreturn a.nextdef print_list(x):while x:print(x.value, end=' ')x = x.nextprint()def reverse(x):one = xtwo = one.nextone.next = None# 如果只有一個元素,那么直接返回if not two: return xthree = two.nextwhile 1:two.next = oneif not three: breaktemp = three.nextthree.next = twoone = twotwo = threethree = tempreturn twol = generate_list() print_list(l) print_list(reverse(l))

二、兩個無環(huán)單鏈表求第一個公共結點

方法非常簡單:求出兩個鏈表長度之差,記為x;然后讓較長的鏈表先走x步;最后讓兩個鏈表攜手并進。

時間復雜度:O(N+M)
空間復雜度:O(1)

三、判斷單鏈表中是否有環(huán),如果有環(huán),找出環(huán)的第一個結點

有一個著名的ro算法,甲乙兩個人同時從起點出發(fā),甲每次走1格,乙每次走兩格。如果甲乙二人有一人走到了終點,那么說明無環(huán);如果甲乙二人都沒有走到終點,而是經過s次走路之后,甲乙二人相遇了,說明有環(huán),并且環(huán)的長度必然是s。因為在x次走路中,甲比乙少走了s步,也就是說環(huán)的長度是s。

----x--|----y----||____z____|

如上圖所示,將鏈表三部分的長度記為x,y,z,甲乙二人在y線段的最右側相遇。那么甲走了x+y步,乙走了x+y+z+y步,顯然(x+y)乘以2等于x+y+z+y。所以z=x。要想找到環(huán)中的第一個結點,只需要發(fā)現(xiàn)一個規(guī)律:讓乙回到起點處(x最左側)且將乙的步伐改為每次走一格,甲繼續(xù)從y的右側(相遇點)出發(fā),兩人下次相遇的地方就是環(huán)中的第一個結點,因為x=z!

有一道類似的趣題:無限一維空間中有兩個生物,這兩個生物之間無法進行交流,現(xiàn)在讓你用如下四條匯編指令編程:
(1)move left
(2)move right
(3)if this position is visited,then goto 語句標號
(4)goto語句(程序中可以使用標號)

現(xiàn)在你需要開發(fā)一套匯編代碼,給這兩個生物安裝上這套程序,保證這兩個生物一定會相遇。
代碼如下:

loop:if this position is visited,then goto movefastmoveleftgoto loop movefast:moveleftmoveleft goto loop

原理是:兩個生物一前一后同時往一個方向走,速度相同。如果看見了另一個生物的軌跡,就開始提速。這樣就肯定能夠追上前面的生物。

四、給定兩個單鏈表,判定它們是否擁有共同結點

---------\\________/ _________/

這個問題比較復雜,需要分類討論。
1、如果兩個鏈表都是無環(huán)單鏈表,那么只需要判斷最后一個結點是否相同即可!
2、如果一個鏈表是無環(huán)單鏈表,而另一個鏈表是有環(huán)的,那么這兩個鏈表必然無公共結點!
3、如果兩個鏈表都是有環(huán)的:
(1)假如兩個鏈表相交,那么環(huán)必然是這兩個鏈表的公共部分,只需要找到鏈表1環(huán)上的某個結點x,看看鏈表2是否會經過結點x
(2)假如兩個鏈表不相交,那么它們的環(huán)必然不相交

五、求兩個有環(huán)單鏈表的第一個公共結點(兩個鏈表保證有公共結點)

首先用ro算法求出環(huán)上的某個點,把這個點當做鏈表的結尾,相當于把這個結點的next設為null。從而問題轉換成了兩條無環(huán)單鏈表求第一個公共結點。這個問題復雜度也是O(M+N)

參考資料

http://blog.csdn.net/v_JULY_v/article/details/6447013

總結

以上是生活随笔為你收集整理的玩转单链表的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。