数据结构作业——P53页算法设计题(7):原地逆转链表

一、 题目描述:

设计一个算法,将链表中所有结点的链接方向“原地”逆转,即要求仅利用原表的存储空间,换句话说,要求算法的空间复杂度为O(1)。

二、算法设计

#include<iostream>

using namespace std;

/*
*课本p53 页第七题
*
*/
#define ElemType int

typedef struct LNode{
    ElemType data;   //定义数据域
    struct LNode *next;
}LNode,*LinkList;

void CreateList(LinkList &L){
    L = new LNode;      //申请存储空间
    L->next = NULL;

    int n;
    cout<<"请输入单链表长度:"<<endl;
    cin>>n;
    LinkList r =L;
    cout<<"请输入单链表的数据元素:"<<endl;
    for(int i=0;i<n;i++){
        LinkList p = new LNode;
        cin>>p->data;
        p->next = NULL;
        r->next = p;
        r = p;
    }
}

void Display(LinkList &L){
    LinkList p = L->next;
    while(p){
        cout<<p->data<<" ";
        p = p->next;
    }
    cout<<endl;
}

void TurnList(LinkList &L){   //逆转链接结点
    LinkList p,q,r;
	p=L->next;//记录list下一个结点的指针
	q=L->next->next;//记录list下下一个结点的指针
	r=L->next->next->next;//记录list下下下一个结点的指针
	while(r)
	{
		q->next=p;//将一个结点的指针赋给下一个结点的指针域
		p=q;
		q=r;
		r=r->next;//指针p,q,r整体往右移一位
	}
	r=q;//记录最后一位元素的指针
	q->next=p;//将倒数第二个元素的指针赋给最后一位元素的指针域
	L->next->next=NULL;//将第一个元素的指针域设为NULL
	L->next=r;//将最后一个元素的指针赋给原本头结点指针的指针域
	Display(L);
}

int main(){
    cout<<"P53页第7题:"<<endl;
    cout<<endl;
    LinkList L;
    CreateList(L);
    cout<<"新创建好的单链表为:"<<endl;
    Display(L);
    cout<<"逆转后的新表为:"<<endl;
    TurnList(L);
}

  • 以上内容在我的个人博客有更详细的解说,请大家移步我的博客
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值