LeetCode:Rotate List

题目链接

Given a list, rotate the list to the right by k places, where k is non-negative.

For example:
Given 1->2->3->4->5->NULL and k = 2,
return 4->5->1->2->3->NULL.


 

首先要弄清题目的意思:旋转链表k个位置,这里旋转一次表示从链表尾部拿一个节点放到链表头部,因此当k等于链表长度的整数倍时,相当于链表又还原到原来的状态。

设链表长度为n,k = k % n, 则题目的意思是相当于把链表的后k个节点放到链表头部,因此我们只需要找到链表的倒数第k个节点,然后让尾节点指向头结点,倒数第k+1个节点的next指向NULL。当然要注意边界条件,例如k刚好是链表长度的整数倍。    本文地址

对于找到链表的倒数第k个节点,可以用双直针的方法,第一个指针先指向第k个节点,第二个指针指向头结点,然后两个节点一起前进,当第一指针指向尾节点时,第二个指针就指向倒数第k个节点

 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         if(head == NULL || head->next == NULL || k == 0)return head;
13         //找到倒数第k个节点backCountK,backCountK_pre是其前驱(k = k % 链表长度)
14         ListNode* backCountK = head, *backCountK_pre = NULL, *p = head;
15         for(int i = 1; i < k; i++)
16         {
17             p = p->next;
18             if(p == NULL)p = head;//表示k超过了链表的长度
19         }
20         
21         while(p->next)
22         {
23             backCountK_pre = backCountK;
24             backCountK = backCountK->next;
25             p = p->next;
26         }
27         if(backCountK_pre == NULL)return head;//k等于链表的长度的整数倍
28         p->next = head;
29         backCountK_pre->next = NULL;
30         return backCountK;
31     }
32 };

 

【版权声明】转载请注明出处:http://www.cnblogs.com/TenosDoIt/p/3702085.html

 

你可能感兴趣的:(LeetCode)