鍊錶問題總結

2021-06-29 14:48:18 字數 4102 閱讀 6352

鍊錶問題總結

//求煉表中節點的個數

unsigned int getlenthlist(listnode * head)

unsigned int length =

0; listnode *pcurrent = head;

while (pcurrent !=

null)

return length;

}/* 單鏈表的反轉

* 從頭到尾遍歷每乙個節點,將其摘下放到新鍊錶的最前端,注意鍊錶為空和

* 只有乙個節點的情況。時間複雜度為o(n)

*/listnode* reverserlist(listnode* head)

listnode* preverserhead =

null;//翻轉後鍊錶的頭

listnode* pcurrent = head;

while (pcurrent !=

null)

return preverserhead;

}/* 查詢單鏈表中倒數第k個節點(k>0)

* 思路是使用兩個指標 第乙個指標在前面走k個節點,然後第二個指標開始走。

* 這樣當第乙個指標走到最後乙個節點的時候,那麼第二指標指向的就是倒數第

* k個節點;

**/listnode* rgetknode(listnode* head, int k)

listnode * first = head;

lis***oe *second = head;

while (first!=

null

&& k--

>

1)

//節點個數小於k返回

if (k>

1|| first==

null)

while (first->m_pnext !=

null)

return second;}/*

* 查詢鍊錶的中間節點

* 思路:設定兩個指標同時向前走,前面的指標一次走2步,後面的指標一次走一步,

* 這樣當第乙個指標走到最後的時候,第二個指標正好走到中間的位置。注意鍊錶的節點

* 個數為0和1的情況。

**/listnode* getmidnode(listnode* head )

listnode * first = head;

listnode * second = head;

while (first->m_pnext !=

null)

}return second;}/*

* 從尾到頭列印鍊錶

*兩種思路: 使用棧,先進後出;使用遞迴;

**///使用棧的方式

void rprintlist(listnode *head)

while (!slist.empty())

}//使用遞迴

void rpintlist(listnode* head)

else

}/** 已知鍊錶phead1和phead2各自有序,把他們合併成乙個鍊錶依然有序

*注意phead1和phead2各自為空的情況和全為空的情況。

*時間複雜度為o(max(len1 || len2))

**/listnode *mergedlist(listnode* phead1, listnode* phead2 )

if (phead1 ==

null)

listnode * mergerlist =

null;

listnode * megerlisttemp =

null;

if (phead1->m_pdata < phead2->m_pdata)

else

listnode * mergedlisttemp = mergerlist;

while (phead1 ! =

null

&& phead2 !=

null)

else

}if (phea1 !=

null)

else

if (phead2 !=

null)

return mergerlist;

}//遞迴演算法

listnode* mergedlist(listnode* phead1, listnode phead2)

if (phead2 ==

null)

listnode *pmergedlist =

null;

if (phead1->m_pdata else

return pmergedlist;}/*

* 判斷乙個單鏈表中是否有環

* 用兩個指標去遍歷 乙個pslow 乙個pfast 如果又環 則一定相遇;

* 就和兩個人在操場跑步一樣的,如果又環則一定會相遇。

**/bool hascircle(listnode* phead)

}return

false;

}/* 判斷兩個單鏈表是否相交

* 如果兩個鍊錶相交,就以為這從相交的點開始,後面的元素是公用的,

* 那麼我們只需要判斷最後乙個元素是否是公用的就可以判定鍊錶是否相交

**/bool isintersected(listnode *phead1, listnode* phead2)

listnode* plast1 = phead1;

while (plast1->m_pnext !=

null)

listnode* plast2 = phead2;

while (plast2->m_pnext !=

null)

if (plast2 == plast1)

else

}/** 給出一單鏈表頭指標phead和一節點指標ptobedeleted,o(1)時間複雜度刪除節點ptobedeleted

* 這是一道google面試題 如果按照一般的思路就是遍歷然後刪除那麼時間的複雜度就是o(n)

* 然後刪除下乙個節點就行了!如果是最後的乙個節點那麼就只能遍歷刪除了。

* 平均的時間複雜度仍為o(1);

**/void deletenode(listnode* phead, listnode* ptobedeleted)

if ( ptobedeleted->m_pnext !=

null)

else

else

pnode->m_pnext =

null;

delete ptobedeleted;

ptobedeleted =

null;

}}}/*

* 單鏈表相交的第乙個節點

*可以借鑑前面判斷兩個但鍊錶是否相交的做法,同時記錄兩個鍊錶的長度。

*如果list1的長度為len1 ,list2的長度我len2,那麼將第一節點先遍歷len1-len2個長度

*這樣兩個節點距離想交節點的距離就相等了。

**/listnode* getfirstcomnode(listnode* head1, listnode* head2)

int len1 =

1; listnode * ptail = head1;

while (ptail->m_pnext !=

null)

int len2 =

1; listnode * ptail2 = head2;

while (ptail2->m_pnext !=

null)

if (ptail2 != ptail) //不相交

listnode* pnode1 = head1;

listnode* pnode2 = head2;

//是他們距離節點的距離相同

if (len1 > len2)

}else

}//判斷如果相同的話就返回

while (pnode2 != pnode1)

return pnode1;

}

鍊錶 鍊錶環問題總結

給定乙個單鏈表,只給出頭指標h 1 如何判斷是否存在環?2 如何知道環的長度?3 如何找出環的連線點在 4 帶環鍊錶的長度是多少?1 如何判斷是否存在環?對於問題1,使用追趕的方法,設定兩個指標slow fast,從頭指標開始,每次分別前進1步 2步。如存在環,則兩者相遇 如不存在環,fast遇到n...

鍊錶環問題總結

給定乙個單鏈表,只給出頭指標h 1 如何判斷是否存在環?2 如何知道環的長度?3 如何找出環的連線點在 4 帶環鍊錶的長度是多少?1 如何判斷是否存在環?對於問題1,使用追趕的方法,設定兩個指標slow fast,從頭指標開始,每次分別前進1步 2步。如存在環,則兩者相遇 如不存在環,fast遇到n...

鍊錶環問題總結

1.given a linked list,determine if it has a cycle in it.follow up can you solve it without using extra space?判斷乙個鍊錶是否有環 思路 通過定義乙個fast指標初始指向頭節點,每次走兩步 定...