鍊錶 在一次遞迴後找到單鏈表的中間元素

2021-09-26 01:23:06 字數 1378 閱讀 5906

方法:快慢指標的方法

快指標每次走2個結點,慢指標每次走1個結點,當快指標走完鍊錶,慢指標剛好走到中間。

注意:當結點數是奇數時 慢指標 走到 中間結點,

當結點數是偶數時,此時中間結點有2個,此時慢指標指向靠前那個結點。

eg 1 3 5 7 9 快指標第一次走到 5 第二次走到 9 然後鍊錶走完,慢指標走2步 剛好走到 中間結點5

1 3 5 7   快指標第一次走到 5 第二次越界只走一步然後鍊錶走完,快指標走2步慢指標走1步,快指標走1步時慢指標沒有                  走,故慢指標 走到結點 3。

如果想 當結點個數為偶數個時,慢指標指向 中間2個結點靠後那個結點,那麼當快指標走1步時,慢指標也走1步。

#include #include #include using namespace std;

//單鏈表結點結構

typedef struct linknode

linknode, *linklist;

//採用尾插法建立單鏈表

bool createlinklist(linklist* list, unsigned int num)

linknode* node = new linknode(); //建立頭結點

*list = node; //鍊錶指向頭結點

node->next = null;//初始化空鍊錶

//設定隨機種子

srand((size_t)time(null));

for(size_t i=0; inext = null;

temp->data = rand() % 100;

//新生成的結點放在單鏈表尾部

node->next = temp;

node = temp;

}return true;

}bool getmidval(linklist list, int *data)

//快慢指標開始都指向 鍊錶第乙個結點

linknode* fast = list->next;

linknode* slow = list->next;

while(fast->next != null)

//當結點為偶數個時,在倒數第二個結點無法走2個結點,就走乙個結點

else

}*data = slow->data;

return true;

}void showlinklist(linklist list)

cout << endl;

}void deletelinklist(linklist list)

}int main()

鍊錶3 一次遍歷找到中間節點

一次遍歷就能夠找到中間節點,怎樣實現的呢?讓我們直奔主題 思想 首先經過兩次遍歷可以找到中間的節點,這個是毋庸置疑的,第一次檢視個數,第二次直接找出來了。但是我今天要記錄的就是怎樣通過一次的遍歷,就把中間的節點給找到!其實,我們可以這樣 定義兩個指標變數,當然是相應的結構體型別的啊,在判斷多餘兩個節...

查詢單鏈表的中間節點,要求只能遍歷一次鍊錶

今天寫的函式是查詢單鏈表中的中間節點,但是要求只能遍歷一遍,如果不是這個條件來限制的話,可以先將鍊錶遍歷一遍,然後通過計數器來計算鍊錶中的資料個數然後通過迴圈來找中間的結點,但是要求只能遍歷一遍也就是說你在知道這個鍊錶中有多少個資料的同時就要知道他的中間資料是哪乙個。這樣的話就不能通過剛剛所說的方法...

鍊錶 在單鏈表中刪除指定值的節點

問題描述 給定乙個鍊錶的頭結點head和乙個整數num,請實現函式將值為num的節點全部刪除。例如 鍊錶為1 2 3 5 3 6 null,num 3,調整後的鍊錶為 1 2 5 6 null 演算法實現 public class node 演算法1 public node removevalue1...