LeetCode 61
Rotate List
Problem Description:
将链表循环右移n个结点
具体的题目信息:
https://leetcode.com/problems/rotate-list/description/Solution:
解题思路
循环右移就是将链表后n个结点搬到链表前面,原尾结点连接原链表头结点,后n个结点从头数的第一个结点为新的头结点,后n+1个结点为新的尾结点。
(1) 确定链表中断点,新的尾结点为后第n+1
个结点,新的头结点为后第n
个结点。因此需要遍历链表获取链表长度,确定中断点的位置。
(2)获取有效的循环右移结点个数,通过与链表长度的取模运算实现。
(3)对新的头结点和尾结点进行设置,使链表连接起来。编程实现
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* rotateRight(ListNode* head, int k) {
if (head == NULL)
return head;
if (head->next == NULL)
return head;
//得到链表总长度
int len = getlength(head);
//记录将链表循环右移的次数
int rotate_num = k%len;
//取模后若发现该值为0说明等价于原链表未经过移动
if (rotate_num == 0)
return head;
//否则从头遍历链表得到中断的点(新的链表头结点)
int head_num = len-rotate_num;
ListNode* initial_head = head;
ListNode* p = head, *pre, *q;
while(head_num--) {
pre = p;
p = p->next;
}
//找到新的尾结点并将其后续结点设为null
pre->next = NULL;
head = p;
while(p) {
q = p;
p = p->next;
}
//新的尾结点原后续节点为新的头结点,并将其后续所有结点连接到原链表头结点(有点绕,自己画个图就懂了)
q->next = initial_head;
return head;
}
int getlength(ListNode* temp) {
int length = 1;
ListNode* t = temp->next;
while(t) {
t = t->next;
length++;
}
return length;
}
};