首页 > 编程语言 >数据结构与算法题目集(中文)6-1 单链表逆转 C语言

数据结构与算法题目集(中文)6-1 单链表逆转 C语言

时间:2024-03-28 14:29:05浏览次数:26  
标签:结点 单链 List C语言 front 数据结构 Next 节点 rear

6-1 单链表逆转

本题要求实现一个函数,将给定的单链表逆转。

函数接口定义:

List Reverse( List L );

其中List结构定义如下:

typedef struct Node *PtrToNode;
struct Node {
    ElementType Data; /* 存储结点数据 */
    PtrToNode   Next; /* 指向下一个结点的指针 */
};
typedef PtrToNode List; /* 定义单链表类型 */

L是给定单链表,函数Reverse要返回被逆转后的链表。

裁判测试程序样例:

#include <stdio.h>
#include <stdlib.h>

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

List Read(); /* 细节在此不表 */
void Print( List L ); /* 细节在此不表 */

List Reverse( List L );

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

/* 你的代码将被嵌在这里 */

输入样例:

5
1 3 4 5 2

输出样例:

1
2 5 4 3 1

 解题思路:

方法一:

最容易想得到的方法,就是利用头插法,让单链表就地逆置。

方法二:

头结点断链,后续每个节点的next结点指向它原来的前驱结点,最后也能完成逆转。简单说就是,把所有的next指针箭头,调转方向,指向前一个。注意:在处理第一个结点时,应将它的next指针置为null;在处理完最后一个节点后,需要将头结点的指针指向它。

代码:

方法一代码:

List Reverse(List L) {
	List p = L, q;
	L = NULL;
	while (p) {
		q = p;
		p = p->Next;
		q->Next = L;
		L = q;
	}
	return L;
}

方法二代码:

List Reverse(List L){//想象链表本来是从左指向右,逆转后变为从右指向左
    List front, rear, tag;
    if(!L) return NULL;//链表为空返回NULL
    rear = L->Next;//rear初始化为头节点右边
    第一个节点
    front = L;//front初始化为头节点,此时front为rear左侧节点
    front->Next = NULL;//逆转后头节点应为最后一个节点,故其Next为空
    while(rear){//rear不断向右移,每轮循环开始时其Next仍指向右,循环结束时rear为空
        tag = rear->Next;//tag为移动指针,不断更新为rear右侧节点
        rear->Next = front;//这一步是关键:rear的下一节点更新为其左侧节点,即其Next指向左
        front = rear;//整体右移,front变为其右侧节点,即rear
        rear = tag;//rear也变为其右侧节点,即tag
    }
    L = front;//此时rear已为空,front作为其左侧节点为整个链表最右侧节点,即新表表头
    return L;
}

标签:结点,单链,List,C语言,front,数据结构,Next,节点,rear
From: https://blog.csdn.net/weixin_54641008/article/details/137107495

相关文章

  • C语言例4-29:计算1+2+...+100之和(利用do-while语句实现)。
    代码如下://计算1+2+...+100之和(利用do-while语句实现)。#include<stdio.h>intmain(void){ intn=1,sum=0; do { sum=sum+n; n++; }while(n<=100); printf("sum=%d\n",sum); return0;}结果如下:说明:本例中do-while循环和while循环完成相同的功能。但是,当......
  • C语言中“ *1.0 ”的作用
    一个“错误的”例子:我们先来看一段简单的代码:下面这个“代码”是一个进行除法运算的代码假设我们进行“3/2”的运算,结果是1.5,但是这串代码最后的结果是1.0,这显然不是我们想要的结果。intmain(){inta,b;floatc;scanf("%d%d",&a,&b);c=a/b;p......
  • C语言经典练习题
    题目       学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。编程解析: 思路1:条件运算符:运用实例a>b?a:b 思路2:ifelse结构的运用 思路3:switchcase结构的运用//思路1:#include<stdio.h>intmain(intargc,charconst*argv[]){i......
  • 【C语言】冒泡排序
    一、数组越界数组越界是在数组本有的元素个数(内存)外,打印数组时,多出的数组内存,为数组越界官方含义:数组下标变量的取值超过初识定义时的大小,导致对数组元素的访问出现在数组的范围之外,C语言常见错误之一二、冒泡排序分析代码:先看主函数创建数组并初始化创建变量sz,......
  • C语言项目(一)----- 贪吃蛇
    1.定义蛇、食物的结构体 2.初始化蛇和食物 3.开始游戏 蛇和墙的碰撞 蛇和自身碰撞 蛇和食物碰撞 重新随机食物 蛇身体增长 分数增长 方向键控制 4.游戏结束 ---1.定义蛇、食物的结构体#defineWIDTH60......
  • c语言:从键盘输入任意年月,输出该年月的天数(用switch语句完成)
    1.switch语句(1)switch是c语言的关键字,switch()后面使用花括号括起来的部分称为switch语句体。(2)紧跟在switch后一对圆括号中的表达式可以是整形表达式,以及后面的将要学习的字符型表达式等。表达式两边的一对括号不能省略。switch()(3)case也是关键字,与其后面的常量表达式合称cas......
  • C语言程序练习——汉诺塔递归
    1.题目        在终端输入汉诺塔层数n,实现将n层汉诺塔通过三座塔座A、B、C进行排列2.代码#include<stdio.h>inthannuota(intlen,intstr,inttmp,intdst){if(1==len){printf("%c->%c\n",str,dst);}else{h......
  • C语言关键字——static和extern
    大家好,今天和大家分享C语言中的两个关键字以及作⽤域和⽣命周期的有关知识,创作不易,三连支持一下吧!一、作用域和生命周期在了解static和extern之前,我们先了解一下作用域和生命周期。1.作用域作⽤域(scope)是程序设计概念,通常来说,⼀段程序代码中所⽤到的名字并不总是有效(可⽤......
  • 用C语言实现简单的五子棋小游戏(附上全代码以及思路讲解)
    目录(全代码在文末哦)  如果要实现五子棋,首先第一步要写一个菜单,让玩家可供选择,比如:输入’1‘,开始游戏,输入’0’,结束游戏。但是你不能只执行一次,所以要写一个dowhile循环,让他至少能循环一次。然后写一个switch语句,让系统来判断玩家选择的什么以此来做出相对应的动作。void......
  • 从零开始学c语言(3)
    常用运算符运算方法&(按位与)  |(按位或)^(按位异或) <<(左移)>>(右移) ~(按位求反) ......