#include<bits/stdc++.h>
using namespace std;
struct ListNode{
int val;
ListNode* next;
};
int main(){
ListNode* head;
ListNode* st;
head=new ListNode;
head->val=-1;//头结点设为-1(可以认为为空),防备m=1的情况发生
head->next=NULL;
ListNode* zhi;
zhi=head;
int k;//共有k个节点
cin>>k;
for(int i=1;i<=k;i++){
st=new ListNode;
st->val=i;
st->next=NULL;
zhi->next=st;
zhi=st;
}//构造链表
int m,n;//从m反转到n
cin>>m>>n;
ListNode* sss;
ListNode* start;
start=head;
for(int i=1;i<m;i++) start=start->next;
sss=start;//sss是衔接第一个出栈的节点的节点,即前一段的最后一个节点
start=start->next;//start是第一个入栈的节点
stack<ListNode*> ss;//直接定义成指针栈更节省空间
for(int i=0;i<=n-m;i++) {
ss.push(start);//入栈的是副本
start=start->next;
}//start此时指向后一段的头结点
ListNode* tt;
while(!ss.empty()) {//给前一段接上栈中节点
tt=ss.top();
sss->next=tt;
ss.pop();//弹栈
sss=sss->next;
}
sss->next=start;//接上后一段
head=head->next;//过掉空节点
while(head){//输出
cout<<head->val<<' ';
head=head->next;
}
}
反转链表——自定义位置反转
最新推荐文章于 2022-04-26 21:44:36 发布