鍊錶解題例項

2021-10-11 04:13:34 字數 3414 閱讀 5937

鍊錶解題例項

1.力扣92.反轉鍊錶ii

本題採用遞迴法求解。其c++**如下:

/**

* definition for singly-linked list.

* struct listnode

* };

*/class

solution

//遞迴

//(1)向子問題尋求結果

listnode* last =

reverse

(head-

>next,n-1)

;//(2)對每一層遞迴作相應處理

head-

>next-

>next = head;

head-

>next = successor;

//(3)返回當層遞迴結果

return last;

}public

: listnode*

reversebetween

(listnode* head,

int m,

int n)

//遞迴操作步驟:

//(1)詢問子問題的結果,並將其儲存在head後的鍊錶中

head-

>next =

reversebetween

(head-

>next,m-

1,n-1)

;//(2)返回當前結果

return head;}}

;

2.力扣141.環形鍊錶

(1)採用遞迴方法進行求解

c++**如下:

/**

* definition for singly-linked list.

* struct listnode

* };

*/class

solution

};

這裡與上述遞迴三部曲的一些小區別在於這裡需要破壞鍊錶的結構,因此在獲取子問題的解時,需要提前使得所經歷的結點產生自環。因此base case為當存在自環連邊時,返回true。

(2)雙指標法(快慢指標法)

//快慢指標法

class

solution

return

false

;

對於環形「跑道」來說,只要二者速度不同,最終一定會相遇。這一題正式利用了上述思想。

3.力扣237題

這一題比較簡單,是常見的刪除單鏈表的某個結點。

/**

* definition for singly-linked list.

* struct listnode

* };

*/class

solution

};

4.力扣25題(困難題)

/**

* definition for singly-linked list.

* struct listnode

* listnode(int x) : val(x), next(nullptr) {}

* listnode(int x, listnode *next) : val(x), next(next) {}

* };

*/class

solution

listnode* last =

reverse

(head-

>next,tail)

; head-

>next-

>next=head;

head-

>next=

null

;return last;

}//(2)三指標法

listnode*

reverse

(listnode* head,listnode* tail)

cur-

>next=pre;

return cur;

}//k個鍊錶為一組進行反轉;

listnode*

reversekgroup

(listnode* head,

int k)

//遞迴法

listnode* c=b-

>next;

listnode* newnode=

reverse

(a,b)

; a-

>next=

reversekgroup

(c,k)

;return newnode;}}

;

5.力扣第2題

利用pre結點與nxt結點解決問題的方法

class

solution

else

add =0;

if(point1)

point1 = point1-

>next;

if(point2)

point2 = point2-

>next;}if

(add==1)

return hair-

>next;}}

;

//當結點為空時以0進行相加,當結點不為空時以結點值進行相加。

int n1 = point1?point1-

>val:0;

int n2 = point2?point2-

>val:

0;

這裡採用hair結點是為了保證在最開始的結點相加過程中產生一條連邊,如果不採用hair結點時,就沒辦法保證在第一次結點相加時,實際上只需要乙個結點。這一題還可以通過記錄尾結點的方式進行解決。

listnode* point3 = hair;

listnode* nxt =

new(listnode)

;point3-

>next = nxt;

point3 = nxt;

利用頭結點與尾結點解決問題的**

class

solution

else

if(l1)

l1 = l1-

>next;

if(l2)

l2 = l2-

>next;}if

(add==1)

return head;}}

;

6.力扣第6題

這一題比較簡單,採用常見的遞迴法就可以了。

class

solution

};

重排鍊錶 解題報告

給定乙個單鏈表 l 1 l 2 l n 1 l n 請編寫程式將鍊錶重新排列為 l n l 1 l n 1 l 2 例如 給定l為1 2 3 4 5 6,則輸出應該為6 1 5 2 4 3。每個輸入包含1個測試用例。每個測試用例第1行給出第1個結點的位址和結點總個數,即正整數n 10 5 結點的位址...

02 鍊錶 解題思路

插入刪除 虛擬頭節點 雙指標 快慢指標 翻轉 中間節點 鍊錶長度 名字 思路203 移除鍊錶元素 力扣虛擬頭節點 移除 2 兩數相加 力扣虛擬頭節點 進製 160 相交鍊錶 力扣86 分隔鍊錶 力扣雙指標 234 回文鍊錶 力扣中間節點 快慢指標 翻轉 138 複製帶隨機指標的鍊錶 力扣 雜湊1一般...

相交鍊錶解法

在面試中被問到這個問題,沒有想出來,遂去leetcode進行檢視,將理解的題解寫在下面 利用兩個臨時的節點遍歷 乙個遍歷a 乙個遍歷b 遍歷完a以後指向b的頭節點開始遍歷 另外乙個反之亦然這是因為此處的相交節點從交點後半段都是相同的設a的長度為a b的長度為b 經過互換頭節點後相交節點前的節點數差異...