單鏈表:資料結點是單向排列的。
乙個單鏈表結點,其結構分為兩部分:資料域和指標域(用來儲存其直接後繼的位址)。例如:
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 已知乙個帶表頭結點的單鏈表,結點結構為 typedef struct node lnode,linklist 在不改變鍊錶的前提下,設計乙個盡可能高效的演算法,查詢鍊錶中倒數第k個位置上的結點 k為正整數 若查詢成功,輸出改結點的data域的值。定義兩個指標p,q,初始時均指向頭結點,p沿鍊錶開始向... 定義並建立鍊錶 include using namespace std include typedef struct listnode listnode void push listnode list,int x else cur next tmp 逆置單鏈表 listnode listrevers... 1 思路 1 定義兩個指標指向頭結點 2 讓其中乙個指標向後移動k 1個結點 為了讓兩個指標之間的距離和倒數第k個節點到尾結點的距離保持一致 3 兩個指標同時向後移動,直到乙個指標指向尾結點,此時另乙個指向的就是k結點。2 實現 1 seqlist.h pragma once typedef int...查詢單鏈表倒數第k個結點 遍歷一次實現
逆置單鏈表 求倒數第k個結點
習題 求單鏈表的倒數第k個結點