[PTA]实验11-2-9 链表逆置

Posted Spring-_-Bear

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[PTA]实验11-2-9 链表逆置相关的知识,希望对你有一定的参考价值。

本题要求实现一个函数,将给定单向链表逆置,即表头置为表尾,表尾置为表头。链表结点定义如下:

struct ListNode {
    int data;
    struct ListNode *next;
};

函数接口定义:

struct ListNode *reverse( struct ListNode *head );

其中head是用户传入的链表的头指针;函数reverse将链表head逆置,并返回结果链表的头指针。

裁判测试程序样例:

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

struct ListNode {
    int data;
    struct ListNode *next;
};

struct ListNode *createlist(); /*裁判实现,细节不表*/
struct ListNode *reverse( struct ListNode *head );
void printlist( struct ListNode *head )
{
     struct ListNode *p = head;
     while (p) {
           printf("%d ", p->data);
           p = p->next;
     }
     printf("\\n");
}

int main()
{
    struct ListNode  *head;

    head = createlist();
    head = reverse(head);
    printlist(head);

    return 0;
}

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

输入样例:

1 2 3 4 5 6 -1

输出样例:

6 5 4 3 2 1 
  • 提交结果:

在这里插入图片描述

  • 源码:
#include <stdio.h>
#include <stdlib.h>

struct ListNode {
    int data;
    struct ListNode* next;
};

struct ListNode* createlist(); /*裁判实现,细节不表*/
struct ListNode* reverse(struct ListNode* head);
void printlist(struct ListNode* head)
{
    struct ListNode* p = head;
    while (p) {
        printf("%d ", p->data);
        p = p->next;
    }
    printf("\\n");
}

int main()
{
    struct ListNode* head;

    head = createlist();
    head = reverse(head);
    printlist(head);

    return 0;
}

/* 你的代码将被嵌在这里 */
struct ListNode* createlist()    /*裁判实现,细节不表*/
{
    struct ListNode* head, * tail, * temp;     // 头节点、尾节点、临时节点

    head = tail = temp = NULL;

    int number;

    scanf("%d", &number);

    while (number != -1)
    {
        // 为临时节点分配内存
        temp = (struct ListNode*)malloc(sizeof(struct ListNode));
        // 临时节点指向空
        temp->next = NULL;
        // 数据域存入数据
        temp->data = number;

        // 将输入的第一个数据存入头节点
        if (head == NULL)
        {
            head = temp;
        }
        else
        {
            // 将临时节点连接到链表尾
            tail->next = temp;
        }

        // 更新尾节点为临时节点
        tail = temp;

        scanf("%d", &number);
    }

    return head;
}

struct ListNode* reverse(struct ListNode* head)
{
    // 原链表为空或只有一个节点,直接返回
    if (head == NULL)
    {
        return head;
    }

    // 创建一个新的链表list,将原链表的节点头插进list中
    struct ListNode* list;
    // 为新建的链表分配内存
    list = (struct ListNode*)malloc(sizeof(struct ListNode));
    // 指向空
    list->next = NULL;

    // 将原链表的头节点数据域赋值给新链表的尾节点
    list->data = head->data;
    // 原链表后移
    head = head->next;

    // 遍历原链表,依次头插
    while (head)
    {
        // 拷贝原链表的当前节点到temp
        struct ListNode* temp = (struct ListNode*)malloc(sizeof(struct ListNode));
        // 拷贝数据域
        temp->data = head->data;
        
        // 将temp连接到list之前
        temp->next = list;
        // 更新list
        list = temp;

        // 原链表后移
        head = head->next;
    }

    return list;
}

以上是关于[PTA]实验11-2-9 链表逆置的主要内容,如果未能解决你的问题,请参考以下文章

第02次作业-线性表

第02次作业-线性表

一·PTA实验作业

表逆置[数组和链表]

第02次作业-线性表

用递归进行链表逆置