题目链接:旋转链表
题意:给定一个链表,旋转链表,将链表每个节点向右移动 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
题解:因为可能出现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 };