题目:
设计一个算法,将不带头节点的单链表所有结点的连接方向“原地”逆转,即要求利用原表的存储空间。
代码:
/*
实验4
设计一个算法,将不带头节点的单链表所有结点的连接方向“原地”逆转,
即要求利用原表的存储空间。
*/
#include <iostream>
using namespace std;
typedef int ElemType;
typedef struct LNode{ElemType data;struct LNode *next;
}LNode,* LinkList;//尾插法
void CreateList_R(LinkList &L,int n)
{LinkList tail,pnew;L=new LNode;cin>>L->data;tail=L;tail->next=NULL;for(int i=0;i<n-1;i++){pnew=new LNode;cin>>pnew->data;tail->next=pnew;tail=pnew;pnew->next=NULL;}
}
//打印链表
void PrintList_L(LinkList L)
{while(L){cout<<L->data<<" ";L=L->next;}cout<<endl;
}
//逆转链表
LinkList ReverseList(LinkList &L,int n)
{if(n==1) //如果只有一个结点return L;LinkList p,q,r;p=L;q=p->next;r=q->next;while(r){q->next=p;p=q;q=r;r=r->next;}q->next=p;L->next=NULL;return q;
}
int main()
{LinkList L;int n; //结点数cout<<"Please input the number of nodes:\n";cin>>n;cout<<"Please input "<<n<<" numbers\n";CreateList_R(L,n);//后插法建表cout<<"Your LinkList is:\n";PrintList_L(L);//打印链表LinkList rail=ReverseList(L,n);cout<<"After reversing,your LinkList is:\n";PrintList_L(rail);//打印链表return 0;
}
输入输出
Please input the number of nodes:
5
Please input 5 numbers
1 2 3 4 5
Your LinkList is:
1 2 3 4 5
After reversing,your LinkList is:
5 4 3 2 1