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