第一篇刷題思考
今日學習起步
鍊錶建立->頭插法
鍊錶建立->尾插法
鍊錶就地逆置
鍊錶定製 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的結點,這樣一來鍊錶的所有結點都有了前驅結點,開始結點 鍊錶實...