关于线性链表的逆序可用循环和递归的两种方式完成,逆序的递归方式比较难理解,主要是返回头结点的问题。
链表节点定义如下:
//定义线性链表结点
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);
}