what did not kill you, make you stronger! 今天下午終於完結這幾日籠在心頭的烏雲,徹底打敗! 之前讀到《劍指offer>第三章的"反轉鍊錶的題目", 當時決定順帶複習國慶放假前的資料結構啥的,於是打算by my own head,不借助書本的來完成, 困難是有的,演算法卡殼了,在座位上苦苦思不得,注意力很難集中時,真的想放棄。又比方說c++語法好像都忘了,這些都不是問題,當決定放棄時才是問題。
現在開始總結:
首先上的是**問題,之後再對指標的操作做總結。
一,**問題
1.單鏈表實現(最簡單的模式,鍊錶不排序,從表頭開始插入新元素)
2.反轉單鏈表
#include using namespace std;//本來想寫成函式模板的,不過想來模板形式簡單,但是需要寫的內容較多,容易出錯誤,這已經領教過了
class list
//必須初始化單鏈表的頭指標listhead, vs會給沒有初始化的指標分配0xcccccccc,而不是0x00000000(null)。
void addnode(int a);
void rotatelist();
void print();
private:
class listnode
int m_value;
listnode *m_pnext;
}; listnode *listhead; //finally i find the errro!!!!!!!!!!!!!!!!!!!
};void list::addnode(int a) //借助的是樹的生成的思想
}//在反轉單鏈表初始時,在使用迴圈還是遞迴時有些糾結,不過再糾結都不如切實的寫**解決問題更加有效。
void list::rotatelist()
q->m_pnext = p;
//指標認識更上一層樓。 無論是 p, q 還是頭指標listhead 都是指標,這裡真正的實物是 new listnode( , )時。所以不要牽掛
//listhead 此時會指向q所指向的位置,而去操心listhead之前指的那個節點會受到影響。因為節點之間的關聯是通過指標完成,一旦關
//聯之後,指標就free to go to whatever it wants.
listhead = q; //listhead = p; 錯誤的**輸出時丟失了鍊錶的第乙個元素。
}//列印鍊錶
void list::print()
cout<
二、 將陣列以某種條件分成兩個部分
最初遇到的問題同樣來自《劍指offer》中將一組整數(有奇數有偶數)中奇數放在陣列的前面,偶數放在後面,要求只遍歷一次陣列。
好吧一看到這個題目,立馬聯想起快速排序的思路,好吧,自虐的路又開始了:先寫這個程式,又寫快速排序by my own hand write it,後來回憶**得不輕,快排的那個遞迴就
讓哥崩潰的,在寫樹的時候,遞迴寫的就艱難,好長時間來這個,在樓道外狠狠轉了一圈還是寫了出來。
明天需要對比快排,再複習一遍
//#include using namespace std;
//void swap(int &a, int &b)
//這個函式本質上都是把乙個陣列分成兩個部分,這裡的演算法借用了 快速排序 的思想
//void odd_even(int a, int length)
//{// int s = -1;
//// for(int i=0; ipivot)
return;
if(first == pivot)
return;
//對當前層進行操作
int s = first - 1;
for(int i=first; i
鍊錶 將單鏈表反轉
todo 將單鏈表反轉 1.先定義乙個結點 2.從頭到尾遍歷原來的鍊錶,每遍歷乙個節點,就將其取出,並放在新的鍊錶的最前端 param head public static void reverse heronode head 原來的鍊錶 heronode temp head.next 當前結點的下...
反轉單鏈表和雙鏈表
單鏈表 用乙個臨時變數節點temp儲存當前節點的下乙個節點,當前節點的下乙個節點指向前節點pre,pre便成為當前節點,當前節點便成為temp 雙鏈表 和單鏈表情況類似,用temp節點儲存當前節點的下乙個節點,當前節點的下乙個節點指向前節點pre,當前節點的上乙個節點指向temp節點 已儲存好的下乙...
單鏈表反轉(遞迴和非遞迴)
單鏈表反轉有遞迴和非遞迴兩種演算法。下面定義節點 cpp view plain copy typedef struct listnodelistnode 在遞迴演算法中的做法是 1找到最後乙個節點和倒數第二個節點,把最後乙個節點設為頭節點的後繼 2反轉這兩個節點 3倒數第三個和第四個節點重複執行步驟...