LeedCode 61 旋轉鍊錶

2021-09-01 06:27:05 字數 2141 閱讀 9248

給定乙個鍊錶,旋轉鍊錶,將鍊錶每個節點向右移動 k 個位置,其中 k 是非負數。

示例 1:

輸入: 1->2->3->4->5->null, k = 2

輸出: 4->5->1->2->3->null

解釋:向右旋轉 1 步: 5->1->2->3->4->null

向右旋轉 2 步: 4->5->1->2->3->null

示例 2:

輸入:0->1->2->null, k = 4輸出:2->0->1->null解釋:向右旋轉 1 步: 2->0->1->null

向右旋轉 2 步: 1->2->0->null

向右旋轉 3 步:0->1->2->null向右旋轉 4 步:2->0->1->null

解題思路:先遍歷一遍,得出鍊錶長度 len,注意 k 可能大於 len,因此令k = (len + (k % len)) % len;。

尾部下乙個設為null即可。使用快慢指標操作,如找鍊錶環等都使用此操作,倒數第k個結點。

/**

* @classname: main

* @description: todo

* @author: mr.ye

* @data: 2018-11-18 20:14

* @version: 1.0

**/class listnode

}class solution

int n = k;

listnode old = new listnode(0);// 新建乙個結點,利於操作

old.next = head;

listnode fast = old; // 快指標

listnode slow = old; // 慢指標

int len = 0;

while(fast.next != null)

fast = old; // 讓快指標從新指向頭結點

n = (len + (n % len)) % len; // 最主要的是 k 肯能是 大於節點長度的。 所以取k 的有效長度

if (n == 0) // 不需要翻轉

return old.next;

while(n > 0)

while(fast.next != null)

old.next = slow.next; // 重新改變整個節點的鏈結

slow.next = fast.next;

fast.next = head;

return old.next;

}}public class main

public static void print(listnode head)

system.out.println("null");}}

方法2:

class solution 

int n = k;

if (head == null || head.next == null || n < 1)

listnode root = new listnode(0);

root.next = head;

listnode p = root;

listnode q = root;

int count = 0;

for (int i = 0; i <= n; i++)

}// 找到第乙個要交換的結點的前驅

// q為第乙個要交換的結點的前驅

while (p != null)

p = q;

q = root;

if (p != null && p.next != null)

}return root.next;

}

執行結果:

61 旋轉鍊錶

給定乙個鍊錶,旋轉鍊錶,將鍊錶每個節點向右移動 k 個位置,其中 k 是非負數。示例 1 輸入 1 2 3 4 5 null,k 2 輸出 4 5 1 2 3 null 解釋 向右旋轉 1 步 5 1 2 3 4 null 向右旋轉 2 步 4 5 1 2 3 null 示例 2 輸入 0 1 2 ...

61,旋轉鍊錶

給定乙個鍊錶,旋轉鍊錶,將鍊錶每個節點向右移動 k 個位置,其中 k 是非負數。示例 1 輸入 1 2 3 4 5 null,k 2輸出 4 5 1 2 3 null解釋 向右旋轉 1 步 5 1 2 3 4 null 向右旋轉 2 步 4 5 1 2 3 null示例 2 輸入 0 1 2 nul...

61 旋轉鍊錶

給定乙個鍊錶,旋轉鍊錶,將鍊錶每個節點向右移動 k 個位置,其中 k 是非負數。示例 1 輸入 1 2 3 4 5 null,k 2 輸出 4 5 1 2 3 null 解釋 向右旋轉 1 步 5 1 2 3 4 null 向右旋轉 2 步 4 5 1 2 3 null 示例 2 輸入 0 1 2 ...