数据结构:链表应用:第8关:链表的逆转


任务描述

本关任务:利用单链表表示一个整数序列,通过一趟遍历,将单链表中所有结点的链接方向逆转。要求空间复杂度为O(1)。

编程要求

输入

多组数据,每组数据有两行,第一行为链表的长度n,第二行为链表的n个元素(元素之间用空格分隔)。当n=0时输入结束。

输出

对于每组数据分别输出一行,逆序输出链表中的元素,元素之间用空格分隔。

测试说明

平台会对你编写的代码进行测试:

测试输入: 5 1 2 3 4 5 6 3 1 2 5 4 6 0

预期输出: 5 4 3 2 1 6 4 5 2 1 3

来源

BJFUOJ


开始你的任务吧,祝你成功

关键在于L->next,也就是头结点的指针域。它在循环的过程中,始终指向逆置的结点(也就是需要改向的,那个结点的前一个),循环过程中p与q每次逆置向后移一位

cpp 复制代码
#include <iostream>
using namespace std;

typedef struct LNode
{
    int data;
    struct LNode *next;
}LNode,*LinkList;

void CreateList_R(LinkList &L,int n)
{
    L->next=NULL;
    LinkList r=new LNode;
    r=L;
    for(int i=0;i<n;i++)
    {
        LinkList p=new LNode;
        cin>>p->data;
        p->next=NULL;
        r->next=p;
        r=p;
    }
}

void Inverse(LinkList &L)
{//逆置带头结点的单链表L
/**************begin************/
   if(L == NULL || L->next == NULL) return; // 如果链表为空或只有一个节点,无需逆置,直接返回    a.
    LinkList p = L->next, q; // 初始化p指向第一个节点
    L->next = NULL; // 将头节点的next置为NULL   1.
    while(p ) {
        q = p->next; // 保存p的下一个节点     2.
        p->next = L->next; // 修改p的next指向
        L->next = p; // 修改头节点的next指向   3.
        p = q; // p移动到下一个节点 
    }



    /**************end************/
}

void PrintList(LinkList &L)
{
    L=L->next;
    while(L){
        if(L->next!=NULL) cout<<L->data<<" ";
        else cout<<L->data;
        L=L->next;
    }
    cout<<endl;
}

int main()
{
    int n;
    while(cin>>n)
    {
        if(n==0) break;
        LinkList L=new LNode;
        CreateList_R(L,n);
        Inverse(L);
        PrintList(L);
    }
    return 0;
}
相关推荐
如此这般英俊4 分钟前
手搓Claude Code-第六章 subagent
数据结构·人工智能·python·语言模型·自然语言处理
Tairitsu_H1 小时前
[LC优选算法#17] 链表 | 合并 K 个升序链表 | K个⼀组翻转链表
数据结构·算法·链表
zwenqiyu4 小时前
非线性字符串数据结构串讲
数据结构·c++·学习·算法
东华万里4 小时前
第32篇 数据结构入门 单链表的增删查改实现
数据结构·链表
文祐5 小时前
C语言用双向链表实现单调递减(递增)队列
c语言·开发语言·链表
OOJO7 小时前
哈希表实现
数据结构·哈希算法·散列表
剑挑星河月9 小时前
234. 回文链表
java·数据结构·算法·leetcode·链表
六bring个六9 小时前
链表学习(常规链表)
数据结构·学习·链表
tachibana21 天前
hot100 回文链表(234)
java·网络·数据结构·leetcode·链表
aaaameliaaa1 天前
进制练习题【找出只出现一次的数字、交换两个变量(不创建临时变量)、统计二进制中1的个数、打印整数二进制的奇数位和偶数位、求两个数二进制中不同位的个数】
c语言·数据结构·笔记·算法