題目描述:
輸入乙個鍊錶,輸出該鍊錶中倒數第k個結點
問題分析:
一句話概括:
兩個指標乙個指標p1先開始跑,指標p1跑到k-1個節點後,另乙個節點p2開始跑,當p1跑到最後時,p2所指的指標就是倒數第k個節點。
思想的簡單理解:
前提假設:鍊錶的結點個數(長度)為n。
規律一:要找到倒數第k個結點,需要向前走多少步呢?比如倒數第乙個結點,需要走n步,那倒數第二個結點呢?很明顯是向前走了n-1步,所以可以找到規律是找到倒數第k個結點,需要向前走n-k+1步。
演算法開始:
設兩個都指向head的指標p1和p2,當p1走了k-1步的時候,停下來。p2之前一直不動。
p1的下一步是走第k步,這個時候,p2開始一起動了。至於為什麼p2這個時候動呢?看下面的分析。
當p1走到鍊錶的尾部時,即p1走了n步。由於我們知道p2是在p1走了k-1步才開始動的,也就是說p1和p2永遠差k-1步。所以當p1走了n步時,p2走的應該是在n-(k-1)步。即p2走了n-k+1步,此時巧妙的是p2正好指向的是規律一的倒數第k個結點處。
這樣是不是很好理解了呢?
考察內容:
鍊錶+**的魯棒性
示例**:
/*
//鍊錶類
public class listnode
}*///時間複雜度o(n),一次遍歷即可
public class solution
k--;
}//如果節點個數小於所求的倒數第k個節點,則返回空
if(count題目描述:
輸入乙個鍊錶,反轉鍊錶後,輸出鍊錶的所有元素。
問題分析:
鍊錶的很常規的一道題,這一道題思路不算難,但自己實現起來真的可能會感覺無從下手,我是參考了別人的**。
思路就是我們根據鍊錶的特點,前乙個節點指向下乙個節點的特點,把後面的節點移到前面來。
就比如下圖:我們把1節點和2節點互換位置,然後再將3節點指向2節點,4節點指向3節點,這樣以來下面的鍊錶就被反轉了。
考察內容:
鍊錶+**的魯棒性
示例**:
/*public class listnode
}*/public class solution
return pre;
}}
題目描述:輸入兩個單調遞增的鍊錶,輸出兩個鍊錶合成後的鍊錶,當然我們需要合成後的鍊錶滿足單調不減規則。
問題分析:
我們可以這樣分析:
假設我們有兩個鍊錶 a,b;
a的頭節點a1的值與b的頭結點b1的值比較,假設a1小,則a1為頭節點;
a2再和b1比較,假設b1小,則,a1指向b1;
a2再和b2比較。。。。。。。
就這樣迴圈往復就行了,應該還算好理解。
考察內容:
鍊錶+**的魯棒性
示例**:
非遞迴版本:
/*
public class listnode
}*/public class solution
//list2為空,直接返回list1
if(list2 == null)
listnode mergehead = null;
listnode current = null;
//當list1和list2不為空時
while(list1!=null && list2!=null)else
//list1指向下乙個節點
list1 = list1.next;
}elseelse
//list2指向下乙個節點
list2 = list2.next;}}
if(list1 == null)else
return mergehead;}}
遞迴版本:
public listnode merge(listnode list1,listnode list2)
if(list2 == null)
if(list1.val <= list2.val)else
}
(4)劍指Offer之鍊錶相關程式設計題
題目描述 輸入乙個鍊錶,輸出該鍊錶中倒數第k個結點 問題分析 一句話概括 兩個指標乙個指標p1先開始跑,指標p1跑到k 1個節點後,另乙個節點p2開始跑,當p1跑到最後時,p2所指的指標就是倒數第k個節點。思想的簡單理解 前提假設 鍊錶的結點個數 長度 為n。規律一 要找到倒數第k個結點,需要向前走...
(4)劍指Offer之鍊錶相關程式設計題
題目描述 輸入乙個鍊錶,輸出該鍊錶中倒數第k個結點 問題分析 一句話概括 兩個指標乙個指標p1先開始跑,指標p1跑到k 1個節點後,另乙個節點p2開始跑,當p1跑到最後時,p2所指的指標就是倒數第k個節點。思想的簡單理解 前提假設 鍊錶的結點個數 長度 為n。規律一 要找到倒數第k個結點,需要向前走...
劍指offer 鍊錶相關
劍指offer面試常考手擼演算法題 鍊錶篇 1.從頭到尾列印鍊錶 1 class solution 8 vectorres 9 stacks 10while head nullptr 1115 while s.empty 1620 return res 21 22 可以直接插入vector中,翻轉v...