單鏈表經典題型

2021-08-29 01:10:48 字數 2396 閱讀 9296

單鏈表中經常考的題型中的四種題型:

1.單鏈表逆置並列印,逆置又分為兩種(1)就地逆置(2)頭插法逆置

(1)就地逆置顧名思義就是在不改變單鏈表儲存的基礎上進行逆置,下面的就是就地逆置的思想,具體見**

struct node *m = q->next; //儲存即將斷開的結點

while (q != null)

q = m;

m = q->next;

} list->head.next = p;

}(2)頭插法逆置,思想如圖,具體內容見**

}2.找出倒數第k個結點,有兩種方法,第一種是找倒數第count(鍊錶長)- k個結點,乙個是用兩個指標p、q,第乙個指標p從首結點跑k個結點之後,另乙個指標q開始從首結點和p指標同時跑,當p指標跑到它指向結點的指標域為空的時候,那麼此時的q針指向的結點就是倒數第k個結點。第二種就是,找第count-k+1的結點,在這裡我們只提供第一種方法的**,**如下:

int findkafter(plist list, int k, elemtype *res)

struct node *p = list->head.next;

struct node *q = p;

while (k > 0)

while (p != null)

*res = q->data;

return 1;

}

3.判斷鍊錶是否有環並找出入環點(1)是否有環:判斷是否有環的時候使用快慢指標,假設q是快指標(一次跑兩個結點),p是慢指標(一次跑乙個結點),當兩個結點相遇的時候就能判斷出該鍊錶是有環的,當然兩個指標一直能跑下去的條件是快指標指向結點的指標域不為空,此時就已經判斷出有環了。

(2)計算鍊錶中環的長度,此時定義的指標i,j每次都指跑乙個結點,不使用快慢指標,第(1)步的時候p、q已經在環內,所以讓i=p,j=p->next,並且定義乙個變數count記錄走過的結點個數,當且僅當i==j的時候,環走完且計算出了環的長度count。

(3)判斷入環點,此時我們利用(1)(2)求出的環的長度,讓p、q都指向首結點,假設鍊錶總長度為m,然後先讓p走環的長度count,那麼此時p沒走的長度就是m-count,q到入環點的長度也是m-count,現在讓p、q(還在首結點)同時走,兩個結點最後相等的時候就是入環點(當兩個指標走了相同長度的時候如果相等了那麼就是入環點,該處可以和第四種型別兩個鍊錶相交做對比考慮把入環點也用y型解決),轉換成y型如下:

**如下:

#include "list.h"

node* findfirstnode(plist list)

} // 判斷上面**從那塊退出的

if (q == null || q->next == null)

// 求鍊錶中環的長度

int clen = 1; // n

while (p->next != q)

// p指標先走clen個結點

p = q = list->head.next;

while (clen > 0)

// 兩個指標同步朝後走,相遇的結點就是入環的第乙個結點

while (p != q)

return p;

}

4.判斷兩個鍊錶是否相交,如果兩個鍊錶中有乙個鍊錶的最後乙個指標指向了null,那麼兩個鍊錶肯定不相交,解題步驟如下:

(1)先計算兩個鍊錶的長度,並且相減,得出的值為k,

(2)讓p指向較長鍊錶的指標先走k個結點,此時p指向的這個鍊錶剩餘長度就和q指向較短鍊錶的長度是一樣的,走完一樣長度的指標,指向的結點如果相等的話那麼兩個鍊錶肯定是相交的。(y型結構)

int twolistmeet(plist list1, plist list2)

} else }

while (p != null && p != q)

if (p == null) //對上面退出迴圈的條件進行逐一判斷,到底是因為p==null退出,還是p==q退出

return 1; //相交

}

單鏈表經典問題3

單鏈表中節點型別定義如下 typedef struct link node,linklist 1.試編寫在帶頭節點的單鏈表l中刪除乙個最小值節點的高效演算法 假設最小值節點時唯一的 void delete minx linklist l pre pre next p p next min pre n...

單鏈表的經典問題

單鏈表中的節點型別描述如下 typedef struct link node,linklist 使用尾插法 頭插法 建立乙個帶頭節點 不帶頭節點 的單鏈表 void creat list head linklist l 頭插法 int x l node malloc sizeof node 先建立乙...

演算法進行時 單鏈表(二)常見題型01

1.用遞迴演算法,刪除帶結點的單鏈表l中所有值為x的結點。由於是帶頭結點的,所以並且查詢值為x的結點時,從l next的值開始判斷,如果l next的data等於x,那麼就要將l next的值刪除並且將l的後繼結點換成l next的後繼結點,並且將它刪除。lnode p l next l next ...