一:鍊錶的逆置(反轉鍊錶)
題目:定義乙個函式,輸入乙個鍊錶的頭結點,反轉該鍊錶並輸出反轉後的頭結點:
節點的結構
這裡面我們需要三個指標分別是cur,用來順序遍歷整個鍊錶,newhead指標用來儲存逆置的頭結點,prev用來逆序遍歷鍊錶.
步驟:
1:先遍歷整個鍊錶找到當前節點的下乙個節點為空,即為尾節點也是逆置後的頭結點
2:prev用來儲存當前節點的上乙個節點.
3:然後更新節點的位置,把當前節點指標指向前乙個節點,再把它的下乙個指標指向當前位置,這樣就可以保證所有節點鏈在一起了.
listnode*reverselist(listnode*phead)
return newhead;
}
二:查詢倒數第k個節點題目:輸入乙個鍊錶,數除該鍊錶的倒數第k個節點.
常規的思路是從尾到頭開始遍歷,然後就可以找到第k個節點,但是我們忽略了乙個前提的條件就是這個鍊錶時單向鍊錶,不能從後先前遍歷,因此這種方法行不通
既然從尾到頭不能遍歷我們還是從頭遍歷,那麼如何找到倒數第k個節點呢?我們先假設鍊錶有n個節點,那麼倒數第k個節點就是從開始向後走n-k+1(n>k)步就好了,如何得到節點數n,遍歷鍊錶每遍歷乙個,計數器加1;
查詢倒數第k個節點我們就要遍歷遍歷兩次事件複雜度就是n^2,那麼如何只遍歷一次事件複雜度是0(n)呢?
方法:快慢指標
我們仔細分析下,
第一步:開始的時候假設快慢指標都指向首位置,
第二步:讓快指標先走k-1步,慢指標不動,
第三步:快慢指標同時走,當快指標走兩步的之後剛好到達鍊錶的尾,而,慢指標走兩步剛好到達k(值為3)的位置.
這樣就可以實現查詢倒數第k個目的.
listnode *findkthtotail(listnode*phead,unsigned int k)
else
}while(fast->next!=
null)
return slow;
}
三:驗證:(c++實現)
#include
#include
using namespace std;
struct listnode
int _val;
listnode*next;
};//逆置單鏈表
listnode*reverselist(listnode*phead)
return newhead;
}//查詢倒數第k個節點
listnode *findnktotail(listnode*phead,unsigned int k)
else
// fast =fast->next;
}while(fast!=null&&fast->next!=null)
return slow;
}//新增節點
listnode* buynode(int
x)//列印單鏈表
void printlist(listnode*phead)
cout
void test()
四: 實現乙個add函式,讓兩個數相加,但是不能使用+、-、*、/等四則運算符。ps:也不能用++、–等等//位運算完成+,-
int add(int a,int b)
return (a^b);
}//減法,a取反再加1
intsub(int a)
int main()
鍊錶倒數第k個節點
兩個指標一前一後,相距k即可。include include using namespace std struct linknode typedef linknode linklist void insertlist linklist list int data else linknode rese...
鍊錶 倒數第k個節點
問題 刪除倒數第k個節點 鏈結 雙指標法,開始時p1,p2都指向頭節點,先讓p2走k步,然後p1和p2一起走,當p2指向null時,p1就指向倒數第k個節點了 definition for singly linked list.struct listnode class solution retur...
查詢鍊錶中倒數第k個節點
問題 輸入乙個鍊錶,輸出該鍊錶中倒數第k個節點。為了符合大多數人的習慣,從1開始計數,即鍊錶的尾節點是倒數第1個節點。例如,乙個鍊錶有6個節點,從頭節點開始,它們的值依次是1 2 3 4 5 6。這個鍊錶的倒數第3個節點是值為4的節點,鍊錶節點定義如下 struct listnode 解題思路 由於...