题目:
给定一个固定的单链表,输入两个数begin和end。将下标为begin到end之间的内容逆置。
给定的单链表为:0->2->4->6->8->10->12->14->16->18
测试数据确保begin和end不会超出单链表的长度范围,并且end>=begin
样例输入
2 4
样例输出
0->2->8->6->4->10->12->14->16->18
分析:如果从头结点开始逆置,则将最后一个节点变为头结点,第一个节点指向尾结点后面的元素,中间的指向倒转即可。如果不是从头结点开始,还要再记录头结点前一个节点。
代码:
#include <iostream>
using namespace std;
struct List
{
int num;
List *next;
};
List *head;
void reverse(int begin, int end, List *&head)
{
List *b;
int sum=0;
b=head;
while(1)
{
if(begin==0)//需要三个指针,前两个分别指向要逆置的两个节点,第三个指向后面的一个节点
{
List *k=head;
List *x=head->next,*y;
for(int i=0;i<end-begin;i++)//循环逆置
{
if(x->next!=NULL)
y=x->next;
else
y=NULL;
x->next=k;
k=x;
x=y;
}
head=k;
b->next=y;
break;
}
else if (sum==begin-1)//同上
{
List *bb=b->next;
List *k=bb;
List *x=bb->next,*y=x;
for(int i=0;i<end-begin;i++)
{
if(x->next!=NULL)
y=x->next;
else
y=NULL;
x->next=k;
k=x;
x=y;
}
b->next=k;
bb->next=y;
break;
}
else
{
if(b->next!=NULL){
b=b->next;
sum++;}
}
}
}
List *Create()
{
List *p = NULL;
List *q = NULL;
head = NULL;
for ( int i = 0; i < 10; i++ ) {
p = new List;
p->num = i * 2;
if ( head == NULL ) {
head = p;
}
else {
q->next = p;
}
q = p;
}
if ( head != NULL ) {
q->next = NULL;
}
return head;
}
void displayList(List *head)
{
while ( head != NULL ) {
cout << head->num;
head = head->next;
if ( head != NULL ) {
cout << "->";
}
}
cout << endl;
}
int main() {
Create();
int begin, end;
cin >> begin >> end;
reverse(begin, end, head);
displayList(head);
return 0;
}