6 Reverse Linked List

分数 20

作者 陈越

单位 浙江大学

Write a nonrecursive procedure to reverse a singly linked list in O(N) time using constant extra space.

Format of functions:

cs 复制代码
List Reverse( List L );

where List is defined as the following:

cs 复制代码
typedef struct Node *PtrToNode;
typedef PtrToNode List;
typedef PtrToNode Position;
struct Node {
    ElementType Element;
    Position Next;
};

The function Reverse is supposed to return the reverse linked list of L, with a dummy header.

Sample program of judge:

cs 复制代码
#include <stdio.h>
#include <stdlib.h>

typedef int ElementType;
typedef struct Node *PtrToNode;
typedef PtrToNode List;
typedef PtrToNode Position;
struct Node {
    ElementType Element;
    Position Next;
};

List Read(); /* details omitted */
void Print( List L ); /* details omitted */
List Reverse( List L );

int main()
{
    List L1, L2;
    L1 = Read();
    L2 = Reverse(L1);
    Print(L1);
    Print(L2);
    return 0;
}

/* Your function will be put here */

Sample Input:

复制代码
5
1 3 4 5 2

Sample Output:

复制代码
2 5 4 3 1
2 5 4 3 1

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

解题思路如下:

1.首先判断该单链表是否为空链表若为空则直接返回改链表

2.若不为空,则创建两个指针beg和end,一个指向原单链表的第一个数据结点,一个指向第一个数据结点的下一个结点。

3.接下来进行四个步骤的循环:

第一步:连(防止断链找不到下一个结点),将beg的Next域指针指向end的Next域指针所指向的结点,那么beg的Next域指向end结点的链将断掉。

第二步:调,将end的Next域指向L的头结点所指向的结点。

第三步:接,将新的第一个数据节点的地址保存在原来的头结点中

第四步:移,将end指针移动到beg的Next指针域指向的结点

具体代码如下:

cs 复制代码
List Reverse(List L) {
    if(L == NULL || L ->Next == NULL){
        return L;//如果链表为空则直接返回该链表
    }
    List beg,end;//创建两个指针
    beg = L->Next;//一个指向单链表的头结点
    end = beg->Next;//一个指向头结点里Next域所指向的结点
    while(end != NULL){//循环条件为end不为空
        beg ->Next = end->Next;//第一步链接
        end->Next = L->Next;//第二步断链、调转
        L->Next = end;//第三步改变链接新的数据结点
        end = beg->Next;//第四步移动指针到新的结点
    }
    return L;
}
相关推荐
书到用时方恨少!1 分钟前
Python 面向对象进阶:多态——同一个接口,千种面孔
开发语言·python·多态·面向对象
徐新帅8 分钟前
4181:【GESP2603七级】拆分
c++·学习·算法·信奥赛
无忧.芙桃8 分钟前
现代C++精讲之处理类型
开发语言·c++
黎梨梨梨_16 分钟前
C++入门基础(下)(重载,引用,inline,nullptr)
开发语言·c++·算法
谁刺我心20 分钟前
[QML]Functional功能型控件-虚拟键盘
开发语言·qml·虚拟键盘
Jasmine_llq21 分钟前
《B4411 [GESP202509 二级] 优美的数字》
算法·暴力枚举算法·逐位校验算法·统一数位判断算法·条件计数算法·自定义函数判断算法
做时间的朋友。29 分钟前
小华地图寻宝
算法
贾斯汀玛尔斯33 分钟前
每天学一个算法--单调栈(Monotonic Stack)
运维·服务器·算法
ZPC821037 分钟前
ROS2 速度远快于 UDP的完整方案(同机节点)
人工智能·算法·计算机视觉·机器人
feVA LTYR42 分钟前
Windows上安装Go并配置环境变量(图文步骤)
开发语言·windows·golang