C 演算法之 鍊錶中倒數第k個節點

2021-06-27 16:15:02 字數 1681 閱讀 8361

題目:輸入乙個鍊錶,輸出鍊錶中倒數第k個節點,為了符合大多數人的習慣,本題從1開始計數,即鍊錶的尾巴節點是倒數第乙個節點。

方法1:先遍歷鍊錶得到鍊錶的個數n,倒數第k個節點就是n-k+1再遍歷一次鍊錶,找到第n-k+1個節點就是倒數第k個節點;這種方法遍歷兩次鍊錶;

方法2:先遍歷鍊錶把鍊錶壓入乙個棧,再出棧,第k次出棧就是第k個節點;

方法3:先反轉鍊錶,再遍歷

方法4:定義兩個指標,第乙個指標從鍊錶的頭指標開始遍歷向前走k-1;第二個指標保持不動,從第k步開始,第二個指標也開始遍歷,兩個指標差距k-1個距離

,當第乙個指標走到了尾巴節點,第二個指標正好在倒數第k個節點;

**:

listnode* findkthfromtail(listnode* plisthead,int k)

listnode* pahead = plisthead;

listnode* pbehind = null;

for (int i = 0; i < k-1; i++)

else

}pbehind = plisthead;

while(pahead->m_pnext != null)

return pbehind;

}

完整**:

// findkthfromtail.cpp : 定義控制台應用程式的入口點。

//#include "stdafx.h"

#include using namespace std;

struct listnode

};listnode* findkthfromtail(listnode* plisthead,int k)

listnode* pahead = plisthead;

listnode* pbehind = null;

for (int i = 0; i < k-1; i++)

else

}pbehind = plisthead;

while(pahead->m_pnext != null)

return pbehind;

}int _tmain(int argc, _tchar* argv)

{ listnode* head = new listnode(1);

listnode* node1 = new listnode(2);

listnode* node2 = new listnode(3);

listnode* node3 = new listnode(4);

listnode* node4 = new listnode(5);

listnode* node5 = new listnode(6);

listnode* node6 = new listnode(7);

head->m_pnext = node1;

node1->m_pnext = node2;

node2->m_pnext = node3;

node3->m_pnext = node4;

node4->m_pnext = node5;

node5->m_pnext = node6;

node6->m_pnext = null;

listnode* p = findkthfromtail(head,3);

cout

鍊錶中倒數第k個節點

題目 輸入乙個鍊錶,輸出該鍊錶中倒數第k個結點。struct listnode方法 定義兩個指標。第乙個指標從鍊錶的頭指標開始遍歷向前走k 1,第二個指標保持不動 從第k步開始,第二個指標也開始從鍊錶的頭指標開始遍歷。由於兩個指標的距離保持在k 1,當第乙個 走在前面的 指標到達鍊錶的尾結點時,第二...

鍊錶中倒數第k個節點

輸入乙個鍊錶,輸出該鍊錶中倒數第k個結點。ac class solution def findkthtotail self,head,k write code here 將每個節點存在棧裡,選取stack中第k個值 stack while head head head.next if k len s...

鍊錶中倒數第k個節點

acwing打卡活動 劍指offer 打卡活動 周二第十題 鍊錶中倒數第k個節點 definition for singly linked list.public class listnode 思路 設列表總結點數為n,則n k 1 為該列表的倒數第k個節點 如 n 10,k 2,則 10 2 1 ...