常見的鍊錶題目

2021-05-27 02:59:05 字數 2798 閱讀 9935

分類: 演算法&資料結構

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

1.單鏈表的反序

2.給單鏈表建環

3.檢測單鏈表是否有環

4.給單鏈表解環

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

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

1.單鏈表的反序

view plain

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

node* reverse(node *head)  

node *cur = head;  

node *pre = null;  

node *tmp;  

while

(cur->next)  

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

return

cur;  

}  

2.給單鏈表建環

view plain

//給單鏈表建環,讓尾指標,指向第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.檢測單鏈表是否有環

view plain

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

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容器

view plain

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

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

bool

unloop_link(node *head)  

else

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

pre = cur;  

cur = cur->next;  

}  return

false

;  }  

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

view plain

//檢測兩條鍊錶是否相交,是則返回第乙個交點,否則返回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.不輸入頭節點,刪除單鏈表的指定節點(只給定待刪除節點指標)

view plain

//無頭節點,隨機給出單鏈表中乙個非頭節點,刪除該節點,當傳入空節點,或者尾節點時,返回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

;  }  

常見的鍊錶題目

一些常見的單鏈表題目,總結思路和實現 1.單鏈表的反序 2.給單鏈表建環 3.檢測單鏈表是否有環 4.給單鏈表解環 5.檢測兩條鍊錶是否相交 6.不輸入頭節點,刪除單鏈表的指定節點 只給定待刪除節點指標 1.單鏈表的反序 view plain 逆轉鍊錶,並返回逆轉後的頭節點 node reverse...

常見的鍊錶題目

一些常見的單鏈表題目,總結思路和實現 1.單鏈表的反序 2.給單鏈表建環 3.檢測單鏈表是否有環 4.給單鏈表解環 5.檢測兩條鍊錶是否相交 6.不輸入頭節點,刪除單鏈表的指定節點 只給定待刪除節點指標 1.單鏈表的反序 逆轉鍊錶,並返回逆轉後的頭節點 node reverse node head ...

資料結構 鍊錶常見題目

include bool insert last list ls,data data tmp next node return true void display list ls printf n list createlist 建立鍊錶 ls head next null 空鍊錶 return l...