美文网首页
4-1 单链表逆转

4-1 单链表逆转

作者: 日常表白结衣 | 来源:发表于2017-08-02 20:38 被阅读0次

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

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
#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;
}

/* 建立链表 */
List Read()
{
    List head = NULL;
    List current;
    List prev = NULL;
    int len = 0;

    printf("pleasr enter the length of the list:\n");
    scanf_s("%d", &len);

    if (len == 0)   return NULL;

    while (len--) {
        current = (List)malloc(sizeof(struct Node));
        if (head == NULL)
            head = current;
        else
            prev->Next = current;
        current->Next = NULL;
        scanf_s("%d", &current->Data);
        prev = current;
    }
    return head;
}

/* 输出链表 */
void Print(List L)
{
    List p = L;
    List s = L;
    List temp;
    if (p == NULL)
        printf("NULL");
    else
        printf("the List is:\n");
    while (p != NULL) {
        printf("%d ", p->Data);
        p = p->Next;
    }

    ///* 释放内存 */
    //while(s!=NULL){
    //temp=s->Next;
    //free(s);
    //s=temp;
    //}
}

/* 
    链表反转 
    思路:每次都将原第一个结点之后的那个结点放在新的表头后面。 
    比如head,1,2,3,4,5 
    第一次:把第一个结点1后边的结点2放到新表头后面,变成head,2,1,3,4,5 
    第二次:把第一个结点1后边的结点3放到新表头后面,变成head,3,2,1,4,5 
    …… 
    直到: 第一个结点1,后边没有结点为止。 
*/
List Reverse(List L)
{
    List head;
    List temp;
    List first;

    if(L==NULL) return NULL;

    head=(List)malloc(sizeof(struct Node));
    head->Next=L; //总的头节点,此指针节点是固定不动的

    first=L;
    while(first->Next!=NULL){
        temp=first->Next;   //保存下L后的节点
        first->Next=temp->Next;     //将temp节点鼓励出来
        temp->Next=head->Next;      //temp节点插在head后面
        head->Next=temp;        //head节点接在temp上
    }
    return head->Next;
}

链表的反转属于基础但是重要的题目,这块也是卡了好久,借鉴了许多别人的博客,程序中关于内存释放那块存在问题。

相关文章

  • 4-1 单链表逆转

    本题要求实现一个函数,将给定的单链表逆转。函数接口定义: 其中List结构定义如下: L是给定单链表,函数Reve...

  • 单链表逆转

    6-1 单链表逆转(20 分)本题要求实现一个函数,将给定的单链表逆转。 函数接口定义: List Reverse...

  • 【C#】【数据结构】033-链表类习题:📝逆转链表问题

    逆转链表: 问题1: 逆转单链表的 前 K 个 连续的节点输入:1-->2--->3--->4--->5--->n...

  • 单链表的逆转

    http://blog.csdn.net/feliciafay/article/details/6841115 p36

  • 单链表的逆转

    方法一 将原先的链表节点摘取下来,使用头结点插入的方法再插入,最后实现单链表的逆序 方法二

  • 032-Reverse Nodes in k-Group

    描述 在一个单链表中,把单链表中的节点以k个节点为一组进行逆转。如果链表的节点个数不是k的倍数,则剩下的节点以原来...

  • 单链表 C++

    单链表 C++ 题目 1、创建单链表2、初始化单链表3、释放单链表4、获取单链表中元素的数量5、输出单链表中的所有...

  • 线性表:顺序表和链表

    顺序表(数组)优缺点 链表优点 单链表使用 单链表结构 单链表初始化 单链表初始化 单链表建立: 头插法 尾插法 ...

  • 单向链表算法

    单向链表 反转单向链表 单链表查找倒数第k个节点 单链表递归倒序打印 单链表排序 单链表删除重复节点

  • 链表基本操作

    1、删除单链表节点 2、插入单链表结点 单链表具体实现

网友评论

      本文标题:4-1 单链表逆转

      本文链接:https://www.haomeiwen.com/subject/qwzelxtx.html