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