一、 题目
给出一个链表,将右边k个节点移到前面。
例如:1->2->3->4->5->NULL,k = 2时
返回 4->5->1->2->3->NULL
二、 分析
之前我们遇到过将字符右移或左移的,当时的思路是将前一部分反转,后一部分反转,整体再反转,即可得到结果。
不过这道题我们需要换一种思路,其实对于这种链表的问题,我们可以总结出,链表的反转都可以直接从某一个位置开始截断即可,例如上面的这道题:
1、h = head,将指针h移到最后一个非空节点,即5的位置p
2、p->next = head,此时形成了一个环,不过这个环只是我们的工具,我们要找到合适的位置截断
3、继续将指针向前移动len-k个,在此截断,返回后一个节点即可
/** * 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 || k == 0) return head; int len = 1; ListNode *h; h = head; while(head->next != NULL){ head = head->next; len++; } k = k%len; if(k == 0) return h; else { head->next = h; k = len - k; while(k--){ head = head->next; } h = head->next; head->next = NULL; head = h; } return head; } };
原文:http://blog.csdn.net/zzucsliang/article/details/44573499