劍指offer 鍊錶相關問題總結

2021-09-08 04:36:50 字數 3208 閱讀 6402

首先統一鍊錶的資料結構為:

struct listnode 

};

題目一:從尾到頭列印鍊錶:

輸入乙個鍊錶。從尾到頭列印鍊錶每乙個節點的值

分析:

難點在於鍊錶僅僅有指向後繼的指標,沒有指向前驅的指標。

轉換思路。結合棧後進先出的特點,能夠遍歷鍊錶,依次將資料元素存入棧中,然後再依次出棧,即為從尾到頭的順序。

vectorprintlistfromtailtohead(struct listnode* head) 

vectorresult;

while(!temp.empty())

return result;

}

目二:鍊錶中倒數第k個結點:輸入乙個鍊錶,輸出該鍊錶中倒數第k個結點。

分析:

(1)依據上題的啟示。事實上這個題也能夠借助棧來完畢。先從頭到尾依次將結點存入棧。然後取出從棧頂開始的第k個結點就可以。

(2)還有一種方法是使用先後指標來完畢,乙個指標先從頭開始向前走k-1步,然後還有乙個指標從頭開始走。當第乙個指標指向最後乙個     結點時,後乙個指標指向倒數第k個結點。

邊界條件:要記得考慮k大於鍊錶長度的情況和k=0的情況都返回空。

方法一:

listnode* findkthtotail(listnode* plisthead, unsigned int k) 

if(len

方法二:

listnode* findkthtotail(listnode* plisthead, unsigned int k)

while(pahead->next!=null)

return pbehind;

}

題目三:反轉鍊錶(鍊錶逆序):輸入乙個鍊錶,反轉鍊錶後,輸出鍊錶的全部元素。

listnode* reverselist(listnode* phead) 

return reverse;

}

題目四:

合併兩個排序的鍊錶:

輸入兩個單調遞增的鍊錶。輸出兩個鍊錶合成後的鍊錶,當然我們須要合成後的鍊錶滿足單調不減規則。

listnode* merge(listnode* phead1, listnode* phead2)

else

}if(phead1)

r->next=phead1;

if(phead2)

r->next=phead2;

return result->next;

}

題目五:

兩個鍊錶的第乙個公共結點,輸入兩個鍊錶,找出它們的第乙個公共結點。

分析:兩個鍊錶都是單向鍊錶。假設他們有公共的結點,那麼這兩個鍊錶從某一結點開始,他們的next都指向同乙個結點,之後全部的點都重合。不可能再出現分叉。所以它們的拓撲形看起來像乙個y形,而不可能是x形。

方法一:首先遍歷兩個鍊錶得到它們的長度,就能知道哪個鍊錶長,以及長的鍊錶比短的鍊錶多幾個結點。在第二次遍歷的時候,在較長的鍊錶上先走相差的步數,接著同一時候在兩個鍊錶上遍歷。找到的第乙個同樣的結點就是它們的公共結點。

時間複雜度o(m+n)。不須要輔助棧。

方法二:分別將兩個鍊錶存入兩個輔助棧中,然後比較兩個棧頂的結點是否同樣。假設同樣,則把棧頂彈出,接著比較下乙個棧頂,直到找到最後乙個同樣的結點。

時間複雜度o(m+n),空間複雜度o(m+n)。

方法一:

listnode* findfirstcommonnode( listnode *phead1, listnode *phead2)

while(q)

if(len1==0||len2==0)

return null;

p=phead1;q=phead2;

while(len1>len2)

while(len1next;

len2--;

}while(p!=q)

return p;

}

方法二:

listnode* findfirstcommonnode( listnode *phead1, listnode *phead2) 

while(q)

listnode *result=null;

while(!temp1.empty()&&!temp2.empty()&&temp1.top()==temp2.top())

return result;

}

題目六:鍊錶中環的入口結點:乙個鍊錶中包括環,請找出該鍊錶的環的入口結點。

分析:有兩個能夠面試的問題:乙個題是推斷乙個鍊錶中。是否有環。

第二個是環的入口結點。

經典方法就是使用快慢指標。快的一次走兩步,慢的一次走一步,假設指標重合,說明鍊錶有環。

在此基礎上,能夠想到,快的比慢的剛好多走了乙個環的長度。並且速度是慢的二倍,說明快的總共走的是兩個環的長度。慢的總共走了乙個環的長度。

所以保持慢指標如今的位置,讓快指標再次從頭走起。每次走一步,當這次兩個指標重合的時候。它們剛好都在環的入口結點上。

推斷是否有環的**:

bool hasloop(listnode* phead)

return false;

}

找環的入口結點**

listnode* entrynodeofloop(listnode* phead)

return slow;}}

return null;

}

劍指offer 鍊錶相關

劍指offer面試常考手擼演算法題 鍊錶篇 1.從頭到尾列印鍊錶 1 class solution 8 vectorres 9 stacks 10while head nullptr 1115 while s.empty 1620 return res 21 22 可以直接插入vector中,翻轉v...

劍指offer 鍊錶相關 刪除value值節點

include include include struct listnode listnode createlink int a,int k else return head 從頭到尾列印列表 void printlink listnode phead coutelse else 書上的 void...

(4)劍指Offer之鍊錶相關程式設計題

題目描述 輸入乙個鍊錶,輸出該鍊錶中倒數第k個結點 問題分析 一句話概括 兩個指標乙個指標p1先開始跑,指標p1跑到k 1個節點後,另乙個節點p2開始跑,當p1跑到最後時,p2所指的指標就是倒數第k個節點。思想的簡單理解 前提假設 鍊錶的結點個數 長度 為n。規律一 要找到倒數第k個結點,需要向前走...