輸入乙個整數陣列,實現乙個函式來調整該陣列中數字的順序,使得所有奇數字於陣列的前半部分,所有偶數字於陣列的後半部分。
輸入:nums = [1,2,3,4]
輸出:[1,3,2,4]
注:[3,1,2,4] 也是正確的答案之一。
0 <= nums.length <= 50000
1 <= nums[i] <= 10000
一、雙指標,取餘
1. 使用雙指標分別指向陣列首位元素下標;
2. 當左下標小於右下標,且當前左下標對應元素為奇數,左指標就一直往後移動,直達指向偶數;
3. 當左下標小於右下標,且當前右下標對應元素為偶數,右指標就一直往前移動,直到指向奇數;
4. 當左指標指向偶數,右指標指向奇數時,兩個元素交換位置;
5. left = right時,遍歷結束,返回陣列即為所求結果。
**實現:
func exchange(nums int) int
for (left < right) && (nums[right] % 2 == 0)
nums[left], nums[right] = nums[right], nums[left] // 直到指標指向偶數,右指標指向奇數,此時交換
}return nums
}
執行效果:
二、雙指標,按位與
**實現:
func exchange(nums int) int
if(nums[right] & 1 == 0)
nums[left], nums[right] = nums[right], nums[left] // 直到左右指標分別指向奇數和偶數,交換
}return nums
}
執行效果:
輸入乙個鍊錶,輸出該鍊錶中倒數第k個節點。為了符合大多數人的習慣,本題從1開始計數,即鍊錶的尾節點是倒數第1個節點。
例如,乙個鍊錶有 6 個節點,從頭節點開始,它們的值依次是 1、2、3、4、5、6。這個鍊錶的倒數第 3 個節點是值為 4 的節點。
給定乙個鍊錶: 1->2->3->4->5, 和 k = 2.
返回鍊錶 4->5.
一、左右雙指標:
1. 宣告left,right兩個指標為listnode的指標型別(這樣不用判斷k是否大於鍊錶長度,直接返回遍歷結束時left指向的鍊錶即為結果);
2. 當前指標先指向鍊錶首節點,然後這個遍歷鍊錶;
3. 使用num統計當前遍歷的節點個數,如果等於k,則左指標指向鍊錶首節點,右指標指向當前正在遍歷的節點;
4. 當走過的節點數num大於k時,左右指標一起往後遍歷,直達鍊錶遍歷結束;
5. 鍊錶遍歷結束,不管鍊錶長度是否大於k,直接返回left指向的節點即可(因為,如果鍊錶長度小於k,left指向空節點;大於等於k則不為空)。
實現**:
/**
* definition for singly-linked list.
* type listnode struct
*/func getkthfromend(head *listnode, k int) *listnode else if num > k
}return left // 遍歷結束,返回左指標即為所求
}
執行結果:
二、快慢指標
主要思路:
1. 當快指標 fast 走了k步的時候慢指標slow 開始走
2.當慢指標 slow 走出的時候(即超出邊界)此時的 slow 位置即為鍊錶中倒數第k個節點
**實現:
func getkthfromend(head *listnode, k int) *listnode else
cur = cur.next // 當前節點後移
}return slow // 返回慢指標
}
執行效果:
難度中等504收藏分享切換為英文接收動態反饋
給你乙個鍊錶的頭節點head
,旋轉鍊錶,將鍊錶每個節點向右移動k
個位置。
示例 1:
輸入:head = [1,2,3,4,5], k = 2輸出:[4,5,1,2,3]示例 2:
輸入:head = [0,1,2], k = 4輸出:[2,0,1]
1. 定義慢指標slow和快指標fast,其初始都指向煉表頭節點。2. 讓快指標fast先向前移動k步。
3. 慢指標slow和快指標fast同時向前移動,每次移動一步,直到快指標fast指向鍊錶的尾節點。這裡,快指標fast指向鍊錶的尾節點,不再繼續向後移動的原因是,需要將尾節點和煉表頭節點相連,因此其所指節點不能為null。此時,慢指標slow所指節點的下乙個節點就是倒數第k個節點。
4. 將快指標fast所指的尾節點的後繼指標指向煉表頭節點,使煉表成環。
5. 倒數第k個節點作為鍊錶旋轉後的新的頭節點,指標slow所指節點作為新的尾節點。
/**
* definition for singly-linked list.
* type listnode struct
*/func rotateright(head *listnode, k int) *listnode
var count int
cur := head
for cur != nil
k = k % count // 當做環形鍊錶的迴圈移動,當k超過鍊錶長度時,人為移動k與k%count個節點效果一樣
slow, fast := head, head // 快慢指標,初始時都指向頭結點
for i := 0; i < k; i++
for fast.next != nil
fast.next = head // 鍊錶的尾節點指向原來的頭結點
cur = slow.next // slow節點的next為旋轉後新鍊錶的頭結點
slow.next = nil // slow節點為新鍊錶的尾節點,斷開之後的連線
return cur
}
雙指標解決陣列排序問題
這個問題如果注意,用一句就可以解決 sort nums.begin nums.end 完事。但是人家明確說了,不能用 庫中的排序函式。我們就得自己去實現排序。其實這個問題很簡單,因為裡面只有三種顏色,用0 1 2 表示。思想也很簡單,就是我們用雙指標遍歷陣列。如果遇到0放在前面,遇到1就在那個位置,...
專題 鍊錶雙指標問題(快慢指標 相遇指標)
雙指標 分別指向兩個鍊錶,每個鍊錶各自乙個指標 快慢指標 指向同乙個鍊錶,一前一後,前進速度不同 相遇指標 指向同乙個有環鏈表,一前一後,前進速度不同 面試題22.鍊錶中倒數第k個節點 definition for singly linked list.public class listnode c...
分隔鍊錶 雙指標操作
給定乙個鍊錶和乙個特定值 x,對鍊錶進行分隔,使得所有小於 x 的節點都在大於或等於 x 的節點之前。你應當保留兩個分割槽中每個節點的初始相對位置。輸入示例 head 1 4 3 2 5 2,x 3 輸出示例 1 2 2 4 3 5 c 結構體 definition for singly linke...