单链表的逆置(递归和非递归)

单链表的递归和非递归逆置

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

typedef char linktype;
typedef struct linklist{
    linktype data;
    struct linklist *next;
}linklist;
void linklistinit(linklist **head)
{
    if(head == NULL)
    {
        return;
    }
    *head = NULL;
}
void linklistprint(linklist *head)
{
    if(head == NULL)
    {
        return;
    }
    linklist *cur = head;
    while(cur != NULL)
    {
        printf("%c",cur->data);
        cur = cur->next;
    }
    printf("\n");
}
linklist * creat(linktype value)
{
    linklist *newnode = (linklist*)malloc(sizeof(linklist));
    if(newnode == NULL)
    {
        return NULL;
    }
    newnode->data = value;
    newnode->next = NULL;
    return newnode;
}
void linklist_pushback(linklist **head,linktype value)
{
    if(head == NULL)
    {
        return;
    }
    if(*head == NULL)
    {
        *head = creat(value);
        return;
    }
    linklist *new = creat(value);
    linklist *cur = *head;
    while(cur ->next != NULL)
    {
        cur = cur->next;
    }
    cur->next = new;
}
linklist* linklist_nizhi1(linklist *head)
{
    if(head == NULL || head->next == NULL)
    {
        return head;
    }
    linklist *newhead = linklist_nizhi1(head->next);//将递归到最后一个元素
    //此时的head就是newhead的前一个元素,将这个元素的下一个的下一个指向自己
    head->next->next = head;
    //也就是说将newhead的下一个指向head,相当于翻转链表,从最后一个开始链
    head->next = NULL;
    //断开链表,防止成环
    return newhead;
}

linklist *linklist_nizhi2(linklist *head)
{
    if(head == NULL || head ->next == NULL)
    {
        return head;
    }
    linklist *p = head;
    linklist *new = NULL;
    while(p != NULL)
    {
        linklist *tmp = p->next;
        //保存p的下一个元素位置
        p->next = new;
        //让当前p的笑一个指向前面的new,并且将new指向p,p指向tmp,也就相当于
        //全部往后挪了一位,然后又开始了下一次交换。
        new = p;
        p = tmp;
    }
    return new;
}

int main()
{
    linklist *head;
    linklistinit(&head);
    linklist_pushback(&head,'a');
    linklist_pushback(&head,'b');
    linklist_pushback(&head,'c');
    linklist_pushback(&head,'d');
    linklist *cur = linklist_nizhi1(head);//递归实现逆置
    linklistprint(cur);
    linklist *cur2 = linklist_nizhi2(cur);//非递归再逆置回来
    linklistprint(cur2);
    return 0;
}

结果

这里写图片描述

©️2020 CSDN 皮肤主题: 精致技术 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值