玩转单链表
玩指針是許多算法的精髓,就是要像六脈神劍一樣,指針亂指一通之后,內存中的數據變得井然有序。
操作指針真的是太好玩了。下面出幾道題。
一、不用額外空間翻轉單鏈表
給定一個單鏈表,要求翻轉之。
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ā)一套匯編代碼,給這兩個生物安裝上這套程序,保證這兩個生物一定會相遇。
代碼如下:
原理是:兩個生物一前一后同時往一個方向走,速度相同。如果看見了另一個生物的軌跡,就開始提速。這樣就肯定能夠追上前面的生物。
四、給定兩個單鏈表,判定它們是否擁有共同結點
---------\\________/ _________/這個問題比較復雜,需要分類討論。
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
總結
- 上一篇: ActiveMq C#客户端 消息队列的
- 下一篇: 图像滤镜艺术---微软自拍APP滤镜实现