题目:设计双链表
题目来源:https://leetcode.cn/leetbook/read/linked-list/f00a2/
题目内容:给你一个链表的头节点 head
,旋转链表,将链表每个节点向右移动 k
个位置。
C++代码实现
注意k可能大于链表长度,将原链表分割为两个短链表,将第一个短链表的末尾指针置为空,第二个短链表的尾结点的next指针域存放原头结点地址。
/**
* 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:
int getLen(ListNode* head){
int size = 0;
if(!head) return size;
ListNode* cur = head;
while(cur){
++size;
cur = cur->next;
}
return size;
}
ListNode* rotateRight(ListNode* head, int k) {
int len = getLen(head);
if(len <= 1 || k % len == 0) return head;
ListNode* cur = head;
int len_1 = len - k % len, len_2 = k % len;
--len_1;
while(len_1--){
cur = cur->next;
}
ListNode* tail_1 = cur,*newhead = cur->next;
while(len_2--){
cur = cur->next;
}
ListNode* tail_2 = cur;
tail_2->next = head;
tail_1->next = nullptr;
return newhead;
}
};