leetcode 24 兩兩交換鍊錶中的節點

2021-10-16 22:21:16 字數 1358 閱讀 1297

有些同學也許會被鍊錶指標給搞的昏頭轉向,在紙上畫出很久都沒搞清楚。下面將介紹一種較為通用的方法:「新建鍊錶法」,可以解決指標亂指等暈頭轉向的操作。只要掌握 刪除節點和尾插法建表 ,大部分鍊錶題目都可以轉換為重新建表問題

「新建鍊錶法」:即使用尾插法構建「新鍊錶」,此處不是從新malloc鍊錶節點,而是改變原節點的指標指向。其步驟如下:

下面以本題舉例上述思想:本題意思是兩個節點一組,後乙個節點處理後要在前乙個節點前面。

判斷當前鍊錶是否構成兩個節點一組:

當前沒有節點:遍歷結束,所有節點已處理。

只有乙個「拆下來」,追加到新鍊錶後;

兩個節點:先「拆」第二個節點並追加到新鍊錶後;再「拆」第乙個節點並追加到新鍊錶後。

最後對「新建鍊錶」尾節點的next指標進行置空操作。

沒有讓人昏頭轉向的指標轉向操作,只涉及到如何「拆節點」和「往新鍊錶後新增拆下的節點」。

​ /* 定義乙個啞結點

​ 定義 end 指標表示鍊錶最後乙個元素, p 為交換的第乙個元素, q 為交換的第二個元素, tmp 指向 p 的 下一次調換結點

​ 演算法如下:

​ 首先將q 插入到 鍊錶尾

​ 然後將p 加入到 鍊錶尾

​ 更新end

​ 更新tmp, 根據tmp 更新 p, q (可能不足兩組)*/

空間複雜度 o(1)

時間複雜度 o(n)

/

*** 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

else

if(tmp-

>

next

== nullptr)

listnode* p = tmp;

listnode* q = tmp-

>

next

;while(1

)else

if(tmp-

>

next

== nullptr)

p = tmp;

q = tmp-

>

next;}

return dummy-

>

next;}

};

LeetCode 24兩兩交換鍊錶的節點

給定乙個鍊錶,兩兩交換其中相鄰的節點,並返回交換後的鍊錶。你不能只是單純的改變節點內部的值,而是需要實際的進行節點交換。示例 給定 1 2 3 4,你應該返回 2 1 4 3.class solution listnode next head.next head.next next.next 指向下...

leetcode24 兩兩交換鍊錶中的節點

給定乙個鍊錶,兩兩交換其中相鄰的節點,並返回交換後的鍊錶。示例 給定 1 2 3 4,你應該返回 2 1 4 3.說明 你的演算法只能使用常數的額外空間。你不能只是單純的改變節點內部的值,而是需要實際的進行節點交換。注意while裡tmp1和tmp2已經交換了,所以node tmp1 definit...

leetcode 24 兩兩交換鍊錶中的節點

給定乙個鍊錶,兩兩交換其中相鄰的節點,並返回交換後的鍊錶。示例 給定 1 2 3 4,你應該返回 2 1 4 3.複製 說明 listnode definition for singly linked list.type listnode struct func head listnode list...