【Leetcode】旋转链表

题目链接:旋转链表


题意:给定一个链表,旋转链表,将链表每个节点向右移动 个位置,其中 是非负数。

输入: 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


题解:因为可能出现k > 链表长度的情况,所以先统计链表长度。得到真正需要移动的步数(k%len)。

然后我们移动到需要移动的这个节点这里,从这里断开成两个链表,然后组合。

举例:

1->2->3->4->5->NULL k = 2

向右移动2步。也就是我们需要从4这里断开。len = 5,k = 2。

但是我们为了方便链表尾节点,所以使指针p移动到3这里就应该停下。

head = p->next;   (4)

p->next = NULL;    (3)


代码:

 1 /**
 2  * Definition for singly-linked list.
 3  * struct ListNode {
 4  *     int val;
 5  *     ListNode *next;
 6  *     ListNode(int x) : val(x), next(NULL) {}
 7  * };
 8  */
 9 class Solution {
10 public:
11     ListNode* rotateRight(ListNode* head, int k) {
12 
13         if(head == NULL || head->next == NULL)  return head;
14 
15         ListNode* p = head;
16         ListNode* pre = NULL;
17         //统计链表长度
18         int len = 0;
19         while(p){
20             pre = p;
21             p = p->next;
22             len++;
23         }
24         k = k%len;
25         if(k == 0 ) return head;
26 
27         pre->next = head;
28         p = head;
29         
30         //断成两个链表
31         for(int i = 0; i < len-k-1; i++){
32             p = p->next;
33         }
34 
35         //重新组合
36         head = p->next;
37         p->next = NULL;
38 
39         return head;
40 
41     }
42 };
原文地址:https://www.cnblogs.com/Asumi/p/12514438.html