美文网首页
单链表逆置算法详解

单链表逆置算法详解

作者: chjxidian | 来源:发表于2019-12-11 08:47 被阅读0次

思路:

首先创建一个单链表,返回一个头节点的指针( head 该头节点不为 NULL,
其次进行单链表的逆置设置。具体设置方法见下:

1.单链表的原有示意图
image.png
2.断开 head 和 R 之间链接 使 head 指向 NULL
image.png
3.使 R 指向 head
image.png
4.断开 R 和 Q 之间的链接
image.png
5.使 Q 指向 R
image.png
6.最后的结果是:
image.png

根据不同的长度依次进行逆置

源码如下:

#include<stdio.h>
#include<stdlib.h>
Typedef struct List
{
    int num;
    struct List *next;
}LNode, LinkList;
/*****************************************
*Funtion: LNode*Creation(int n)
*Descrition: create a singly linked list according to the specified length
*Param: n indicate the length you want to create.
*Data:2014-02-28
*****************************************/
LNode *Creation(int n)
{
    LinkList head; //定义一个头节点
    LinkList p1; //定义中间转换的节点
    LinkList p2;
    Head = NULL; //初始化头节点
        int num;
    int i;
    for (i = n; i > 0; --i)
    {
        p1 = (LinkList)malloc(sizeof(LNode)); //分配内存
        scanf(“%d”, &num);
        p1->num = num;
        if (head == NULL)
        {
            head = p1;
        }
        else
        {
            p2->next = p1; //指定后继节点
        }
        p2 = p1; //节点后移
    }
    p2->next = NULL;
    return head;
}
/*******************************
*Function: LinkList Reverse(LNode *head)
*Descrition: reverse the link according to head;
*Data:2014-02-28
******************************/
LinkList Reverse(LNode *head)
{
    LNode *p; //定义中间转换节点
    LNode *r;
    if (head->next && head->next->next)
    {
        p = head; //获取头节点地址
        r = p->next; //获取链表第二个节点地址
        p->next = NULL; //头节点变尾节点之后下个指向是NULL
        while (r)
        {
            p = r; //第一个节点顺移
            r = r->next; //第二个节点顺移
            p->next = head; // 使第二个节点的下一个节点指向前一个
            head = p; //给头节点赋值
        }
        return head;
    }
    return head;
}
//the entry function
int main()
{
    LinkList p1;
    LinkList p2;
    int num;
    printf(“输入你想创建的链表长度\n”);
    scanf(“%d”, &num);
    printf(“创建一个单向链表\n”);
    p1 = Creation(num);
    printf(“逆置链表\n”);
    p2 = Reverse(p1);
    printf(“逆置之后的链表是:”)
        while (p2)
        {
            printf(“%d ”, p2->num);
            p2 = p2->num;
        }
    return 0;
}

相关文章

  • 单链表逆置算法详解

    思路: 首先创建一个单链表,返回一个头节点的指针( head 该头节点不为 NULL,其次进行单链表的逆置设置。具...

  • 王道数据结构练习

    练习2.5 //试编写算法将带头结点的单链表就地逆置#include #include #include u...

  • 算法面试:链表转置

    //单链表定义 普通的循环的方法。 //单链表逆置实现 递归调用方法

  • 插入任意数据形成有序单链表并逆置单链表

    可直接运行的完整C语言版有序单链表的生成和逆置标签:数据结构、线性表、带头结点的单链表、逆置单链表欢迎与喜欢数据结...

  • 单链表就地转置

    试写一道算法,实现单链表的就地逆置(反转),即利用原表的存储空间将线性表(a1,a2,⋯an)逆置(反转)为(an...

  • 单链表翻转

    单链表的就地逆置:就地逆置即空间复杂度为O(1)一:用数组存储单链表的值,然后重新逆序赋值,效率较低。二:利用三个...

  • 单链表逆置

    单链表逆置的思路 a:将单链表储存为数组,然后按照数组的索引逆序进行反转。b:使用3个指针遍历单链表,逐个链接点进...

  • 常见面试算法题1:单链表逆置

    单链表逆置可以说是最为常见的一道算法面试题了;思路就是遍历单链表的同时,将当前节点的next指向头结点,并更新头结...

  • 线性表之单链表实现

    线性表之单链表实现 实现单链表的初始化、插入、删除等基本运算 实现单链表的输入、输出运算 实现单链表的逆置、归并、...

  • 单链表的逆置

    方法一:迭代逆置 在上一篇文章的基础上添加Reverse()方法。 方法二:递归逆置

网友评论

      本文标题:单链表逆置算法详解

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