首先統一鍊錶的資料結構為:
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個結點,需要向前走...