單鏈表遍歷一次求倒數第k個結點和中間結點

2021-07-28 05:27:32 字數 1072 閱讀 5710

單鏈表:資料結點是單向排列的。

乙個單鏈表結點,其結構分為兩部分:資料域和指標域(用來儲存其直接後繼的位址)。例如:

typedef struct nodestudent;
上述**定義了乙個單鏈表的結點,其中字元型陣列char name[20]用來儲存姓名。指標*link是乙個用來儲存其直接後繼的指標。

單鏈表中每個結點的位址是儲存在其前驅結點的next域中,而開始結點無前驅,故應設頭指標head指向其開始結點。

鍊錶由頭指標唯一確定,單鏈表可以用頭指標的名字來命名。

求單鏈表倒數第k個節點:

常規做法:

先遍歷一次鍊錶求出鍊錶長度n,鍊錶的倒數第k個節點即正數的第(n-k+1)個,但是這樣需要遍歷兩次鍊錶。

遍歷一次鍊錶的思路:

1、定義兩個指標p1和p2均指向煉表頭指標,p1先遍歷鍊錶,走(k-1)步,p2保持不變。

2、從第k步開始,同時移動兩個指標,始終保持兩個指標的距離為(k-1)。當p1到鍊錶最後乙個指標時,p2指向的恰好是鍊錶倒數第k個節點。

**實現:

#include #include using namespace std;

typedef struct nodenode;

/* * 遍歷一遍就得到單鏈表的中間結點的方法

* 思想:兩個指標,乙個每次走一步,另乙個每次走兩步,兩步走完的時候,一步的就是結果

*/ int getcenternode(node *head)

return temp -> data;//偶數個節點時,返回前乙個節點的值

}void displaylist(node *head)

cout << endl;

}/*求鍊錶倒數第k個節點*/

node* kthnode(node *head,int k)

if(p2 -> next == null)

return null;

while(p2->next)

return p1;

} int main()

displaylist(head);

cout

查詢單鏈表倒數第k個結點 遍歷一次實現

已知乙個帶表頭結點的單鏈表,結點結構為 typedef struct node lnode,linklist 在不改變鍊錶的前提下,設計乙個盡可能高效的演算法,查詢鍊錶中倒數第k個位置上的結點 k為正整數 若查詢成功,輸出改結點的data域的值。定義兩個指標p,q,初始時均指向頭結點,p沿鍊錶開始向...

逆置單鏈表 求倒數第k個結點

定義並建立鍊錶 include using namespace std include typedef struct listnode listnode void push listnode list,int x else cur next tmp 逆置單鏈表 listnode listrevers...

習題 求單鏈表的倒數第k個結點

1 思路 1 定義兩個指標指向頭結點 2 讓其中乙個指標向後移動k 1個結點 為了讓兩個指標之間的距離和倒數第k個節點到尾結點的距離保持一致 3 兩個指標同時向後移動,直到乙個指標指向尾結點,此時另乙個指向的就是k結點。2 實現 1 seqlist.h pragma once typedef int...