旋转链表
Posted olajennings
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了旋转链表相关的知识,希望对你有一定的参考价值。
给定一个链表,旋转链表,将链表每个节点向右移动 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
/** * 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; } ListNode *p = head; ListNode *tail = NULL; int len = 1; while(p->next != 0){ len++; p = p->next; } tail = p; if(len == k){ return head; } else if(len < k){ int m = k%len; if(m == 0){ return head; } else{ return move(head, tail, len-m); } } else{ return move(head, tail, len-k); } } ListNode* move(ListNode* head, ListNode* tail, int k){ ListNode *p = head; for(int i = 1; i < k; i++){ p = p->next; } tail->next = head; head = p->next; p->next = NULL; return head; } };
解题思路:
1.先遍历一遍链表,算出链表长度 len。
2.如果 k < len,其实就是移动后 k 个结点。
3.如果 k = len,那就直接返回。
4.如果 k > len,k = k % len,此时退化为步骤2。
以上是关于旋转链表的主要内容,如果未能解决你的问题,请参考以下文章
Butterknife 片段旋转给出 NullPointer