题目描述:给一个链表的头结点 head,旋转链表,将链表每个节点向右移动 k 个位置
示例1:
输入:1->2->3->4->5->NULL, k=2
输出:4->5->1->2->3->NULL
示例2:
输入:1->2->3->NULL, k=5
输出:2->3->1->NULL
解题思路:由于是右移,给的又是头节点,所以得找出旋转后的新链表的尾节点 tail,
tail->next即为新链表的头节点
解题过程:先遍历整个链表,得出链表长度len。将原链表的尾节点指向其头节点,形成闭环。然后找出新链表的尾节点,断环,形成新链表。
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(int x, ListNode *next) : val(x), next(next) {} * }; */ class Solution { public: ListNode* rotateRight(ListNode* head, int k) { if(k==0||head==nullptr||head->next==nullptr) return head;
//遍历整个链表,得出链表长度len int len=1; ListNode* l=head; while(l->next) { l=l->next; len++; }
//将链表首尾相接 int move_k=k%len; if(move_k==0) return head; l->next=head;
//找出新链表的尾节点 for(int i=0;i<len-move_k;i++) l=l->next;
//断环 形成新链表 ListNode* newhead=l->next; l->next=nullptr; return newhead; } };
原文:https://www.cnblogs.com/Almicro/p/14587906.html