雙指標解決陣列鍊錶問題

2021-10-21 18:03:33 字數 3770 閱讀 1636

輸入乙個整數陣列,實現乙個函式來調整該陣列中數字的順序,使得所有奇數字於陣列的前半部分,所有偶數字於陣列的後半部分。

輸入: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...