题目:给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。
力扣原题
思路:求出链表长度,找出k位置,让tail指向尾巴,
步骤1:把tail指向头节点
步骤2:head指向倒数k位置
步骤3:让倒数k节点的前一个节点指向空
如图所示:
//链表向右移动k位
ListNode* rotateRight(ListNode* head, int k)
{
ListNode*p=head;
ListNode*tail=p;
int n=0;
while(p)//求出链表长度,让指针tail指向最后个节点
{
tail=p;
p=p->next;
n++;
}
k=k%n;//求余数
p=head;//初学者很容易忘记这步
for(int i=0;i<n-k-1;i++)
{
p=p->next;//找到倒数k的前一个节点
}
tail->next=head;//让尾巴指向头
head=p->next; //头指向倒数第k个节点
p->next=nullptr;//倒数k的前一个节点指向空
return head;
}
测试代码:
/*************************************************************************
> File Name: 1-旋转链表.cpp
> Author:
> Mail:
> Created Time: Tue 29 Mar 2022 10:02:16 PM CST
题目: 给你一个链表的头节点 head ,然后将链表每个节点向右移动 k 个位置
思路:求出链表长度,找出k位置,让tail指向尾巴,
步骤1:把tail指向头节点
步骤2:head指向倒数k位置
步骤3:让倒数k节点的前一个节点指向空
************************************************************************/
#include<iostream>
using namespace std;
class Solution
{
public:
struct ListNode
{
int val;
struct ListNode*next;
ListNode(int val):val(val),next(nullptr){}
};
//1. 在链表最前面插入一个节点,插入完成后,新插入的节点为链表的新的头结点
ListNode*addAtHead(int val)
{
ListNode* newNode = new ListNode(val);
newNode->next = _dummyHead->next;
_dummyHead->next = newNode;
return _dummyHead->next;
}
//尾插法
ListNode*addeare(int val)
{
ListNode* newNode = new ListNode(val);
ListNode* pre=_dummyHead;
while(pre->next!=nullptr)
{
pre=pre->next;
}
//退出循环说明pre的下个位置为空,即链表队尾
pre->next=newNode;
return _dummyHead->next;//返回头
}
// 2.打印链表
void printLinkedList()
{
ListNode* cur = _dummyHead;
while (cur->next != nullptr)
{
cout << cur->next->val << " ";
cur = cur->next;
}
cout << endl;
}
//链表向右移动k位
ListNode* rotateRight(ListNode* head, int k)
{
ListNode*p=head;
ListNode*tail=p;
int n=0;
while(p)//求出链表长度,让指针tail指向最后个节点
{
tail=p;
p=p->next;
n++;
}
k=k%n;//求余数
p=head;//初学者很容易忘记这步
for(int i=0;i<n-k-1;i++)
{
p=p->next;//找到倒数k的前一个节点
}
tail->next=head;//让尾巴指向头
head=p->next; //头指向倒数第k个节点
p->next=nullptr;//倒数k的前一个节点指向空
return head;
}
ListNode* _dummyHead= new ListNode(0);
};
int main()
{
// //输入:1 4 3 2 5 2 x=3;
// //输出:1 2 3 4 3 5
Solution s,s1;
s.addeare(1);
s.addeare(2);
s.addeare(3);
s.addeare(4);
s.addeare(5);
Solution::ListNode*l1=s.addeare(6);
s.printLinkedList();//打印移动前数据
Solution:: ListNode*head=s.rotateRight(l1,3);//链表向右移动
//打印移动后链表
Solution::ListNode*q=head;
while(q)
{
cout<<q->val<<" ";
q=q->next;
}
cout<<endl;
return 0;
}