首先,最容易想到的方法就是遍歷一遍單鏈表,求出整個單鏈表的長度n,然後將倒數第k個,轉換為正數第n-k個,接下去遍歷一次就可以得到結果。但是該方法需要對鍊錶進行兩次遍歷。
第二種方法,從頭結點開始,依次對鍊錶的每乙個結點元素進行這樣的測試:遍歷k個元素,檢視是否到達鍊錶尾,直到找到那個倒數第k個元素。這種方法需要對同一批元素進行反覆多次的遍歷,對於鍊錶中的大部分元素而言,都要遍歷k個元素,如果鍊錶長度為n,該演算法時間複雜度為o(kn)級,效率太低。
此時可想到另外一種更高效的方法。定義兩個指標,讓其中乙個指標比另乙個指標先前移k步,然後兩個指標同時往前移動。迴圈直到先行的指標值的下乙個值為null時,另乙個指標所指的位置就是所要求的位置。
public node findelem(node head, int k)
node p1 = head;
node p2 = head;
for (int i = 0; i < k; i++)
while (p1.next != null)
return p2;
}分析:定義兩個指標fast和slow,其中fast是快指標,slow是慢指標。二者的初值都指向煉表頭,slow每次前進一步,fast每次前行兩步,兩個指標同時向前移動,快指標每移動一次都要和慢指標相比較,直到當快指標等於慢指標為止,就可證明該鍊錶是帶環的單向鍊錶,否則,證明鍊錶是不帶環的。
public boolean isloop(node head)
while(fast != null && fast.next != null)
}return !(fast == null || fast.next == null);}
當判斷鍊錶是否有環後,那麼如何找到環的入口點呢?
可以在煉表頭和相遇點分別設乙個指標,每次走一步,兩個指標必定相遇,且相遇第一點為環入口點。
public node findloopport(node head)
if(fast == null || fast.next == null)
//慢指標從煉表頭開始,快指標從相遇點開始
slow = head;
while(slow != fast)
return slow;
}如果兩個鍊錶相交,那麼它們一定有著相同的尾節點。
public boolean isintersect(node h1,node h2)
node n1 = h1;
while(n1.next != null)
node n2 = h2;
while(n2.next != null)
return n1 == n2;}
該演算法只需要分別遍歷一次兩個鍊錶,因此演算法的時間複雜度為o(len1+len2),len1和len2分別代表兩個鍊錶的長度。
如果兩個鍊錶相交,如何找到它們相交的第乙個結點呢?
首先分別計算兩個鍊錶的長度len1和len2(假設len1>len2),接著先對鍊錶一遍歷(len1-len2)個結點到結點p,此時結點p與鍊錶二到它們相交的結點的距離相同,再同時遍歷兩個鍊錶,直到遇到相同的結點為止,這個結點就是它們相交的結點。
public static node getfirstmeetnode(node h1,node h2)
node n1 = h1;
node n2 = h2;
int len1 = 0;
int len2 = 0;
//找到鍊錶h1的最後乙個結點
while(n1.next != null)
//找到鍊錶h2的最後乙個結點
while(n2.next != null)
//兩個鍊錶不相交
if(n1 != n2)
//找出較長的鍊錶,遍歷
if(len1 > len2) else
for(int i = len1 - len2; i > 0; i--)
while(n1 != null && n1 != n2)
return n1;}
資料結構單鏈表
初學資料結構,貼段自己編寫的單鏈表程式,希望自己能夠一直以強大的學習熱情持續下去!自勉!2012年3月30日 於大連 include using namespace std typedef struct node linklist,node linklist makelist int n void ...
資料結構 單鏈表
今天浪費了好多時間,也許是心裡想著明天的考試吧 可自己也知道這次的考試,自己畢竟過不了了,只好等到今年11月份,想想那時自己已經大三了 還有那麼多時間嗎!很懊惱今天不知怎麼回事,感嘆環境真的可以影響乙個人,真的可以 把今天的學習筆記寫下來,沒有進行好好的整理,這回單鏈表的功能較多,操作比較散,最後乙...
資料結構 單鏈表
實現乙個單鏈表 1 查詢 查詢第index個節點 查詢指定的元素 2 插入 將指定的元素插入到第index個節點上 3 刪除 將第index個節點刪除 規律 刪除和新增元素前務必儲存兩個元素的位址引用資訊 public class mylinkedlist 記錄鍊錶結構的頭結點位址引用 privat...