劍指offer系列8 鍊錶中倒數第k個結點

2022-04-03 02:22:23 字數 1365 閱讀 6368

看到這個題我有兩個思路

1.遍歷鍊錶得到長度n,判斷n與k的關係,若n>k,返回空,其他情況下輸出n-k個結點的資訊

2.將鍊錶資料壓棧,然後彈出k個。

這道題返回的是鍊錶結點,所以方法2不行,2只能在求資料的時候可以。給出我的思路的**:

1 #include2

3using

namespace

std;

4struct

listnode

11*/

12};

13class

solution

25 count = count+1;26

//cout << count << endl;

27int n = 0; //

本來在35行直接計算的,以防越界我設定了變數n

28if (k >count)

2932

else

3339

return

plisthead;40}

41};

42int

main()

43

看35行,本來我是這麼得到相應的結點的,但是這樣我在vs裡面run沒有問題,上交到牛客網提示報錯說陣列越界,堆疊溢位,我想問題是不是我定義的是鍊錶,對於鍊錶資料的儲存是不按照物理記憶體的位置而定的。所以我對鍊錶首個結點不能進行+和減得操作。我在我的**因為我定義的鍊錶為了方便是特殊的結構體陣列的形式,所以我的測試用例的鍊錶記憶體之間是相鄰的,可是牛客網上測試用例的鍊錶物理記憶體不相鄰,因此發生了陣列越界。正確的應該是用for迴圈,鍊錶訪問第k個結點只能用for迴圈的方式!

關於.訪問和->訪問,.訪問的左側是物件,->訪問的左側是指標。

下面是根據答案寫出來,答案的思路很高效,根本不需要先遍歷一遍。而是設定兩個指標分別是right和left。最開始兩個指標都指向鍊錶的頭指標,然後給right指向k-1個結點,在將right和left同步向後乙個結點移動,知道right移動到null時,left的位置就所求的答案。這樣只需要遍歷一遍鍊錶即可。下面給個這個思路的**:

1

class

solution

14if (r ==null)

15return

null;

16else

1724}25

return

l ;26

}27 };

總結一下這道題,關於鍊錶是只能順序訪問的,所以各種題目總是喜歡讓你反著訪問鍊錶的值。這種情況雙指標是很好的辦法。

在分析每一道題時,首先要考慮到數的邊界問題,考慮到傳入的值得安全性,再去做相應的處理,不要預設傳入的值都是符合要求的,思路一定要全面。

劍指offer系列 反轉鍊錶

題目描述 給定乙個單鏈表的頭節點,反轉該鍊錶,並返回反轉後的頭節點 分析 從鍊錶頭部開始向後遍歷,注意每次要儲存待反轉節點的prev和next節點 listnode reverselist listnode head return p 其中1 m n list.len 示例 給定的單鏈表為 1 2 ...

劍指offer系列 14 鍊錶中倒數第k個結點

輸入乙個鍊錶,輸出該鍊錶中倒數第k個結點。1 借助棧 或陣列 public listnode findkthtotail1 listnode head,int k stack stack newstack listnode p head int num 0 while p null if numfo...

劍指offer 鍊錶中倒數第k個結點(鍊錶)

輸入乙個鍊錶,輸出該鍊錶中倒數第k個結點。分析 兩個指標pointresult和pointend一起指向頭結點,然後根據k,移動pointend,使pointresult和pointend的距離為k 1。然後同時移動pointresult和pointend,當pointend指向最後乙個結點時,po...