反轉單鏈表 和 將陣列按照某種條件分為前後兩個部分

2021-07-05 16:22:16 字數 1917 閱讀 5273

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倒數第三個和第四個節點重複執行步驟...