乙個體面人的刷題之旅
給你乙個鍊錶,每 k 個節點一組進行翻轉,請你返回翻轉後的鍊錶。
k 是乙個正整數,它的值小於或等於鍊錶的長度。
如果節點總數不是 k 的整數倍,那麼請將最後剩餘的節點保持原有順序。
首先,這是一道鍊錶反轉題目,我們要對操作動作和資料結構的關聯敏感,一看到翻轉,就想到先進後出啊,這樣就順序反轉了不嘛!一提到先進後出!!------棧!
既然讓我們每k個節點反轉那麼我們把原鍊錶的每k個節點依次入棧,在把我們k個節點依次出棧,迴圈這樣做,直到將所有的節點反轉完成,(這裡要考慮的是當剩餘的節點小於k時,我們就不改變順序了,所以這種情況是我們的乙個分支)。
talk is cheap,show me the code!
所有的鍊錶題我們都需要定義乙個啞巴節點來指向我們的入參節點,這樣我們在最後可以直接返回啞巴節點的next返回我們操作的煉表頭就可以了。(我開始的時候真的不懂為什麼,後來做多了慢慢就懂了。所以大家加油,別放棄 不會可以 多做幾遍,在不會 就在做,實在不行 鍛鍊身體 找阿姨去把)
listnode dumy =
newlistnode(0
);dumy.next = head;
然後,這裡我們要定義乙個current節點,通過這個節點我們可以做到不改變dumy指標的情況下,對head進行翻轉。
listnode current = dumy;
這裡還需要定義個next節點,表示我們正在翻轉的節點,這個節點從我們要翻轉鍊錶的頭部開始。
listnode next = dumy.next
初始化乙個棧容器用來翻轉鍊錶
stack
context =
newstack
();
接下來就是遍歷節點,把它們放到棧裡,然後提取翻轉。
while
(next != null)
//判斷特殊情況,也就是放入棧中的節點數量小於k,說明我們遍歷到最後了,剩餘的節點不滿足一次翻轉的數量,我們直接返回dumy.next,終止操作就可以了。
if(context.
size()
!= k)
return dumy.next;
//出棧,翻轉,
while
(context.
size()
!=0)//這裡是將當前節點指向剩餘未翻轉節點,這樣我們在如果剩餘長度不滿足k的情況下就可以直接返回了。
current.next = next;
}
class
solution
if(context.
size()
!= k)
return dumy.next;
while
(context.
size()
!=0) current.next = next;
}return dumy.next;
}}
大家考慮下,我們可不可以不用額外空間實現呢?
大家考慮下,我們可不可以不用額外空間實現呢?
待續。。。
LeetCode 25 k個一組翻轉鍊錶
給出乙個鍊錶,每 k 個節點一組進行翻轉,並返回翻轉後的鍊錶。k 是乙個正整數,它的值小於或等於鍊錶的長度。如果節點總數不是 k 的整數倍,那麼將最後剩餘節點保持原有順序。給定這個鍊錶 1 2 3 4 5 當 k 2 時,應當返回 2 1 4 3 5 當 k 3 時,應當返回 3 2 1 4 5 這...
LeetCode 25 K個一組翻轉鍊錶
按照每k個為一組,記錄這組內的頭和尾,第一組只需記錄翻轉後的尾即tail 接下來的每一組記錄翻轉後頭 nhead 和尾 ntail.注意更新的順序 class solution length k if length 0 return head p head listnode otail head l...
leetcode 25 k個一組翻轉鍊錶
題目描述 給出乙個鍊錶,每 k 個節點一組進行翻轉,並返回翻轉後的鍊錶。k 是乙個正整數,它的值小於或等於鍊錶的長度。如果節點總數不是 k 的整數倍,那麼將最後剩餘節點保持原有順序。示例 給定這個鍊錶 1 2 3 4 5 當 k 2 時,應當返回 2 1 4 3 5 當 k 3 時,應當返回 3 2...