常見的單鏈表題目

2021-06-10 13:49:23 字數 2962 閱讀 4498

一些常見的單鏈表題目,總結思路和實現**。

1.單鏈表的反序

2.給單鏈表建環

3.檢測單鏈表是否有環

4.給單鏈表解環

5.檢測兩條鍊錶是否相交

6.不輸入頭節點,刪除單鏈表的指定節點(只給定待刪除節點指標)

1.單鏈表的反序

[cpp]view plain

copy

//逆轉鍊錶,並返回逆轉後的頭節點

node* reverse(node *head)  

node *cur = head;  

node *pre = null;  

node *tmp;  

while

(cur->next)  

cur->next = pre;                     //結束時,操作cur的next逆轉

return

cur;  

}  

2.給單鏈表建環

[cpp]view plain

copy

//給單鏈表建環,讓尾指標,指向第num個節點,若沒有,返回false

bool

bulid_looplink(node *head, 

intnum)  

for(i = 1; i < num; ++i)  

cur = cur->next;  

}  tail = cur;  

while

(tail->next)  

tail->next = cur;  

return

true

;  }  

3.檢測單鏈表是否有環

[cpp]view plain

copy

//檢測單鏈表是否有環,快慢指標

bool

detect_looplink(node *head)  

while

(quick_node != slow_node)  

if(quick_node != null && slow_node != null)    

//非尾節點相遇

return

true

;  return

false

;  }  

4.給單鏈表解環

ps:為了增加節點點陣圖的效率,本應使用hash或則紅黑樹,這裡不造車了,直接用 set容器

[cpp]view plain

copy

//找到有環節點,並解環,找到並解環,返回true,無環,返回false

//思路:先找到環節點:被2個節點指向的節點(一定有環的條件)ps:不考慮中間環,因為只有乙個next節點,只可能是尾環

bool

unloop_link(node *head)  

else

//指向已被遍歷過的節點,此時pre節點為尾節點

pre = cur;  

cur = cur->next;  

}  return

false

;  }  

5.檢測兩條鍊錶是否相交

[cpp]view plain

copy

//檢測兩條鍊錶是否相交,是則返回第乙個交點,否則返回null

//思路:把2個鍊錶各遍歷一遍,記下長度length1和length2,若2者的尾節點指標相等,則相交。

//       之後再把長的鍊錶從abs(len1-len2)的位置開始遍歷,第乙個相等的指標為目標節點

node* detect_intersect_links(node *first_link, node *second_link)  

while

(first_link->next || second_link->next)     

//遍歷2個鍊錶

if(second_link->next)  

}  if(first_link != second_link)                 

//比較尾節點

pos = legnth1 - length2;  

if(legnth1 < length2)                  

//保證 longer_link為長鍊錶

while

(pos-- > 0)  

longer_link = longer_link->next;  

while

(longer_link || shorter_link)  

longer_link = longer_link->next;  

shorter_link = shorter_link->next;  

}  return

null;  

}  

6.不輸入頭節點,刪除單鏈表的指定節點(只給定待刪除節點指標)

[cpp]view plain

copy

//無頭節點,隨機給出單鏈表中乙個非頭節點,刪除該節點,當傳入空節點,或者尾節點時,返回false

//思路:由於沒有頭節點,非迴圈單鏈表,無法獲取目標節點的前節點,所以只能把它的next節點資料前移,並刪除next節點

//ps:當傳入節點為尾節點,無法用此方法刪除

bool

withouthead_delete_node(node *target_node)  

cur = target_node->next;  

target_node->name = cur->name;  

target_node->next = cur->next;  

delete

cur;  

return

true

;  }  

單鏈表的一些常見題目

有乙個單鏈表,其中可能有乙個環,也就是某個節點的next指向的是鍊錶中在它之前的節點,這樣在鍊錶的尾部形成一環。問題 1 如何判斷乙個鍊錶是不是這類鍊錶?2 如果鍊錶為存在環,如果找到環的入口點?解答 一 判斷鍊錶是否存在環,辦法為 設定兩個指標 fast,slow 初始值都指向頭,slow每次前進...

單鏈表典型題目

劍指 offer 25.合併兩個排序的鍊錶 劍指 offer 22.鍊錶中倒數第k個節點 劍指 offer 06.從尾到頭列印鍊錶 劍指 offer 141.環形鍊錶 給定鍊錶,請你每隔1個節點輸出1個 如1 3 4 6 11 12 輸出1 4 11 思路 利用棧的特性先進後出,壓入陣列,時間複雜度...

單鏈表常見操作

編譯環境 vs2008 include includetypedef char datatype typedef struct listnodelistnode,linklist 建立乙個空的帶頭結點的鍊錶 linklist createlist 建立乙個非空的鍊錶,頭插法 int createli...