【C语言】用递归和循环两种方法实现单链表倒置

网上有很多关于单链表倒置的博文,但发现并不是所有都可以直接套用的,尤其是要注意单链表是否定义有表头(header)。

定义单链表结构:

struct Node;
typedef struct Node *LinkList;

struct Node
{
    int data;
    LinkList next;
};


头部插入法添加链表元素:

LinkList AddNode(LinkList L, int value)
{
    LinkList P = NULL;
    if (L==NULL)
    {
        P = (LinkList)malloc(sizeof(struct Node));
        if (P==NULL)
        {
            perror("Not enough space!\n");
        }
        P->data = value;
        P->next = NULL;
        // Header
        L = (LinkList)malloc(sizeof(struct Node));
        if (L==NULL)
            perror("Not enough space!\n");
        L->next = P;
    } 
    else
    {
        P = (LinkList)malloc(sizeof(struct Node));
        if (P==NULL)
        {
            perror("Not enough space!\n");
        }
        P->data = value;
        P->next = L->next;
        L->next = P;
    }
    return L;
}

递归实现单链表倒置:

LinkList Reverse(LinkList L)
{
    LinkList P = NULL;
    if (L == NULL) 
        return L;
	if (L->next == NULL)
		return L;
    P = Reverse(L->next);
    L->next->next = L;
    L->next = NULL;
    return P;
}

LinkList ReverseRecursive(LinkList L)
{
	LinkList Head, P = NULL;

	if (L == NULL) 
        return L;
	Head = L;
	P = L->next;
	P = Reverse(P);
	Head->next = P;

	return Head;
}
非递归方式实现链表倒置,这是使用的方法类似表头插入法:
LinkList ReverseNoneRecursive(LinkList L)
{
    LinkList pCurrent = NULL;
    LinkList pNext = NULL;
    if (L == NULL)
        return L;

    pCurrent = L->next;
    L->next = NULL;

    while(pCurrent)
    {
        pNext = pCurrent->next;
        pCurrent->next = L->next;
        L->next = pCurrent;
        pCurrent = pNext;
    }
    return L;
}
// 打印链表
void PrintLinkList(LinkList L)
{
    LinkList P;
    P = L->next;
    while(P!=NULL)
    {
        printf("%d ", P->data);
        P = P->next;
    }
    printf("\n");
}
// 释放链表占用内存 
void DestoryLinkList(LinkList L)
{
    if(L->next != NULL)
        DestoryLinkList(L->next);
    free(L);
    L = NULL;
}
int main()
{
    LinkList L = NULL;
    L = AddNode(L, 10);
    L = AddNode(L, 2);
    L = AddNode(L, 4);
    L = AddNode(L, 7);
    PrintLinkList(L);

	L = ReverseRecursive(L);
	// L = ReverseNoneRecursive(L);
	PrintLinkList(L);
    DestoryLinkList(L);
    return 0;
}

你可能感兴趣的:(【C语言】用递归和循环两种方法实现单链表倒置)