现在的位置: 首页 > 综合 > 正文

线性链表的逆序操作

2019年09月30日 ⁄ 综合 ⁄ 共 2018字 ⁄ 字号 评论关闭

关于线性链表的逆序可用循环和递归的两种方式完成,逆序的递归方式比较难理解,主要是返回头结点的问题。

链表节点定义如下:

//定义线性链表结点
typedef struct node {
    int data;
    struct node *link;
}LNode, *LinkList;

循环方式完成逆序:

//逆转线性链表
LinkList reverseList(LinkList head)
{
    LinkList reversedHead = NULL;
    LinkList pPrev = NULL;
    LinkList pNode = head;

    while(pNode != NULL)
    {
        LinkList pNext = pNode->link;
        if(pNext == NULL)
            reversedHead = pNode;

        pNode->link = pPrev;
        pPrev = pNode;
        pNode = pNext;
    }

    return reversedHead;
}

递归方式完成递归:

LinkList reverseList2(LinkList head)
{
    if(head == NULL || head->link == NULL)
        return head;

    LinkList newHead = reverseList2(head->link);
    head->link->link = head;
    head->link = NULL;

    return newHead;
}

基本功能的测试代码如下:

/*
 * =====================================================================================
 *
 *       Filename:  reverseLink.c
 *
 *    Description:  逆转线性链表
 *
 *        Version:  1.0
 *        Created:  2012/10/18 15时28分00秒
 *       Revision:  none
 *       Compiler:  gcc
 *
 *         Author:  YOUR NAME (), 
 *   Organization:  
 *
 * =====================================================================================
 */
#include <stdlib.h>
#include <stdio.h>

//定义线性链表结点
typedef struct node {
    int data;
    struct node *link;
}LNode, *LinkList;

//逆转线性链表
LinkList reverseList(LinkList head)
{
    LinkList reversedHead = NULL;
    LinkList pPrev = NULL;
    LinkList pNode = head;

    while(pNode != NULL)
    {
        LinkList pNext = pNode->link;
        if(pNext == NULL)
            reversedHead = pNode;

        pNode->link = pPrev;
        pPrev = pNode;
        pNode = pNext;
    }

    return reversedHead;
}  
 
LinkList reverseList2(LinkList head)
{
    if(head == NULL || head->link == NULL)
        return head;

    LinkList newHead = reverseList2(head->link);
    head->link->link = head;
    head->link = NULL;

    return newHead;
}

//打印线性链表
void printList(LinkList list)
{
    LinkList p = list;
    while( p != NULL )
    {
        printf("%d ", p->data);
        p = p->link;
    }

    printf("\n");
}

//创建线性链表
void creatList(LinkList *list)
{
    int a[] = {0, 1, 2, 3, 4, 5, 6, 7};
    LinkList previous;
    for( int i = 0 ; i < sizeof(a)/sizeof(int); ++i )
    {
        LinkList p = (LinkList)malloc(sizeof(LNode));
        if( p != NULL )
        {
            p->data = a[i];
            p->link = NULL;
        }
        if( *list == NULL )
        {
            *list = p;
            printf("*list == NULL\n");
        }
        else
            previous->link = p;

        previous = p;
    }
}

int main()
{
    LinkList list = NULL;
    creatList(&list);
    printList(list);

    LinkList reversedList = reverseList(list);
    printList(reversedList);
    LinkList reversedList2 = reverseList2(reversedList);
    printList(reversedList2);
}

抱歉!评论已关闭.