基本思想:
解法一:o(n^2)
先算出鍊錶的長度n,然後倒數第k個結點就是順序的第(n-k+1)個數,不過這樣需要2次遍歷鍊錶,第一次統計出煉表中節點的個數n,第二次就能找到倒數第k個節點。
解法二:o(n)
只需一次遍歷。設定兩個指標p1和p2,兩個指標剛開始都指向鍊錶的第乙個結點,然後讓p1指標先走(k-1)步,然後再讓兩個指標一起往後走,當p1指標指向鍊錶最後乙個結點的時候,p2指標剛好指向鍊錶中的倒數第k個結點。
#include using namespace std;
typedef int elemtype;//資料型別模板
typedef struct node//結點
node;
typedef struct node * linklist;
//建表
node* creat_link(node *head)
return head;//建完錶後返回頭結點
} //輸出
void output_link(node * head)
cout
p1=p1->next;
else
return null;
} p2=head;
while(p1->next!=null)
return p2;
}
void main()
{ node *head=null;
node * phead=creat_link(head);//建表
output_link(phead);//輸出
node * result = foo(phead,3);
cout
劍指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節點。因此調整時 需要知道當前節點以及當前節點前面乙個節點,以及當前節點後面乙個...