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

2021-09-20 14:54:18 字數 2452 閱讀 7676

題目描述:

輸入乙個鍊錶,輸出該鍊錶中倒數第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...