鍊錶系列 3 19日

2021-10-04 04:14:12 字數 2012 閱讀 3529

第一篇刷題思考

今日學習起步

鍊錶建立->頭插法

鍊錶建立->尾插法

鍊錶就地逆置

鍊錶定製 m 到 n 的位置節點逆置

尋找鍊錶公共節點

鍊錶是否有環,有環的話找到這個環的入口

// an highlighted block

typedef struct node

}node,

*list;

/* 頭插法,生成的是倒序的 list

*/list creatbyhead

(int* arr, int len)

node* head =

newnode(0

);for(int i =

0; i < len; i++

)return head;}/*

尾插法,得出來的是正序的,常用

*/list creatbytail

(int* arr,int len)

node* head =

newnode(0

);node* p = head;

for(int i =

0; i < len; i++

)return head;}/*

鍊錶就地逆置

*/list listreverse

(list head)

node* p = head;

node* newhead = nullptr;

while

(p)return newhead;}/*

*/list listreversebetween

(list head, int m, int n)

node* modify_tail = head //這就是逆置段最終的尾節點,此時 modify_tail/head 指向了第m 個元素,這就是要被逆置的第乙個元素

while

(head && changelen--

)//此函式執行完 head 指向了逆置段尾的下乙個元素,也就是第 n 個元素的下乙個

//連上尾巴

modify_tail-

>next = head;

//連上頭,要判斷下是否是從第乙個元素開始的逆置,是的話pre可能為空

if(pre)

else

return result;}/*

求兩個鍊錶的公共節點,關鍵是先尾部對齊,然後依次尋找即可

*/list findcommenelem

(list heada, list headb)

node* a = heada;

node* b = headb;

int a_len =0;

int b_len =0;

while

(a)while

(b)if

(a_len > b_len)

}else

}//此時 a與 b 的長度一樣了,乙個"y"的形狀,順序找下去即可

while

(heada && headb)

heada = heada-

>next;

headb = headb-

>next;

}return nullptr;}/*

尋找鍊錶環,同時返回鍊錶環的入口,快慢指標思想,找到相遇節點後,從相遇節點跟頭結點開始一起走,相等的節點就是入口

*/bool detectcycle

(linklist head, node* meet = nullptr)

node* slow = head;

node* fast = head;

bool result =

false

;while

(fast)

fast = fast-

>next;

if(fast == slow)}if

(result)

else}}

return result;

}

鍊錶系列 3 21日

今日刷題 k 個鍊錶合併兩種解法 鍊錶排序 nlogn 時間複雜度 linklist solution mergekllist vector vec for auto i vec sort v.begin v.end cmp for auto i v return head next 方法二 多路歸...

鍊錶系列 鍊錶環相關問題

設定兩個節點 slow fast,若存在環,分別從鍊錶的頭節點出發,乙個每次向後移動一步,另乙個移動兩步,兩個指標移動速度不一樣,如果存在環,那麼兩個指標一定會在環裡相遇。public boolean hascircle node head node slow head node fast head...

鍊錶系列二 鍊錶的C 表示

這裡以單鏈表為例闡述如何用c 實現表的基本表示 1 表的結構 通過開始結點a0可以訪問整個表元素,最後的乙個結點的指標為null。2 引入表頭結點 在實現中,為了實現對各個結點的處理的一致性,引入了乙個頭結點,頭結點是指向鍊錶開始結點a0的結點,這樣一來鍊錶的所有結點都有了前驅結點,開始結點 鍊錶實...