劍指Offer 面試題15 鍊錶中倒數第k個結點

2021-06-25 12:39:49 字數 2013 閱讀 7227

/*

鍊錶中倒數第k個節點:

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

倒數第乙個節點。例如乙個鍊錶有6個節點,從頭節點開始它們的值依次是1,2,3,4,5,6。這個鍊錶的倒數第三個

節點是值為4的結點。

輸入:輸入可能包含多個測試樣例,輸入以eof結束。

對於每個測試案例,輸入的第一行為兩個整數n和k(0<=n<=1000, 0<=k<=1000):n代表將要輸入的鍊錶元素的個數,k代表要查詢倒數第幾個的元素。

輸入的第二行包括n個數t(1<=t<=1000000):代表鍊錶中的元素。

輸出:對應每個測試案例,

若有結果,輸出相應的查詢結果。否則,輸出null。

樣例輸入:

5 21 2 3 4 5

1 05

樣例輸出:

4null

要考慮k的取值:

k = 0,返回null

加入k > n,此時應該也返回null

0< k <= n,返回倒數第k個節點

*//*

關鍵: 若p1 = p2 = null,那麼p1走k步後,兩者一起走

*/#include const int inf = 1000000000;

const int maxsize = 1001;

typedef struct node

node;

void buildlist_headinsert(node** phead,int n,int* parr)

//頭插法的玄機:每次使新插入的節點指向剛剛的頭結點,然後使自己成為頭節點

//node* prearnode = *phead;

//prearnode->_next =

node* pnode,*pfrontnode,*prearnode;//因為剛開始的頭結點最終會在頭插法下變成最後的結點

for(int i = 0 ; i < n ;i++)

else

}prearnode->_next = null;//設定尾節點的指向為空

*phead = pfrontnode;

}void buildlist(node** phead,int n,int* parr)//採用尾插法

node* pcurnode;

for(int i = 0 ; i < n ; i++)

else//建立頭結點}}

void freelist(node** phead)//刪除鍊錶

}//倒數第k個節點,1,2,3,4,5,6,k = 3,可以另p1 = 1,p2 = 1,p1走到3處(走了k-1次),然後p2 與 p1 一起走剩下的n-k+1次,則p2一共走:

int reciprocalknode(int n,int k,int* parr)//

node* head = new node();

node** phead = &head;//這樣做的原因是:好讓頭指標能夠修改,若直接傳遞node*作為頭節點,則修改後會作為區域性變數最後消失

buildlist_headinsert(phead,n,parr);//建立鍊錶

node* p1,*p2;

p1 = p2 = *phead;

//p1先走k-1步之後,p1與p2再一起走

int icnt = 0;

while(p1->_next != null)

else//如果icnt 已經大於k-1,表名p1已經走完

p1 = p1 ->_next;

}int ires = p2->_ival;

freelist(phead);

return ires;

}void process()

int ires = reciprocalknode(n,k,iarr);

if(ires != inf)

else}}

int main(int argc,char* argv)

劍指offer面試題15

面試題15 鍊錶中倒數第k個結點 題目 輸入乙個鍊錶,輸出該鍊錶中倒數第k個結點。為了符合大多數人的習慣,本題從1開始計數,即鍊錶的尾結點是倒數第乙個結點。例如乙個鍊錶有6個結點,從頭結點開始它們的值依次是1 2 3 4 5 6。這個鍊錶的倒數第3個結點是值為4的結點。預備知識 鍊錶結點的定義如下 ...

劍指offer 面試題16 反轉鍊錶

題目描述 輸入乙個鍊錶,反轉鍊錶後,輸出鍊錶的所有元素。hint 請務必使用鍊錶 輸入 輸入可能包含多個測試樣例,輸入以eof結束。對於每個測試案例,輸入的第一行為乙個整數n 0 n 1000 代表將要輸入的鍊錶的個數。輸入的第二行包含n個整數t 0 t 1000000 代表鍊錶元素。輸出 對應每個...

劍指Offer面試題16 反轉鍊錶

反轉鍊錶 定義乙個函式,輸入乙個鍊錶的頭結點,反轉該鍊錶並輸出翻轉後鍊錶的頭結點。分析 假設h,i,j三個節點。h節點已經指向前面的節點,i節點要指向h節點,這時,i與j中間斷開,因此在將i節點指向 h節點之前,先記下j節點。因此調整時 需要知道當前節點以及當前節點前面乙個節點,以及當前節點後面乙個...