题目描述
给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数。
示例:
输入: 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
思路
1.首先我们可以遍历一次链表,获取链表的长度n。
2.我们可以将头结点移动 (n-k%n -1)次 获取后半部分的链表。
3.我们可以将后半部分连接的下一个结点保存起来,那便是前一部分的链表。
4.最后将前后两部分的链表拼接到一起即可。
5.注意将后半部分的链表尾部置空即可。
Java代码实现
public ListNode rotateRight(ListNode head, int k) {
//首先获取链表的长度
ListNode p = head;
int len = 0;
while(head != null){
len++;
head = head.next;
}
//不需要移动链表,直接返回即可
if(len == 0 || len == 1 || k == 0 || k%len == 0)
return p;
//头部需要移动的距离
int tailDis = len-k%len-1;
ListNode last = p;
//后半部
ListNode behind = last;
while(tailDis>0){
tailDis--;
last = last.next;
}
ListNode front = last.next;
ListNode res = front;
//尾部链表置空
last.next = null;
//拼接链表
while(front.next != null){
front = front.next;
}
front.next = behind;
return res;
}Golang代码实现
func rotateRight(head *ListNode, k int) *ListNode {
if head == nil || k == 0{
return head
}
len := 0
p := head
for p != nil {
p = p.Next
len++
}
if(len == 1 || k%len == 0){
return head
}
step := len - k%len -1
p = head
tail := p
for step>0 {
p = p.Next
step--
}
newHead := p.Next
p.Next = nil
p = newHead
for p.Next != nil {
p = p.Next
}
p.Next = tail
return newHead
}
京公网安备 11010502036488号