C语言反转单链表

来源:互联网 发布:ubuntu ppa是什么 编辑:程序博客网 时间:2024/05/16 07:04

反转单链表

        定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。链表结点定义如下:

        struct node
        {
                int val;
                struct node *pNext;
      };


#include <stdio.h>#include <stdlib.h>struct node{    int val;    struct node *pNext;};struct node *gen(){    struct node *pHead = NULL;    for(int i = 10; i > 0; i--){        struct node * p = (struct node *)malloc(sizeof(struct node));        p -> val = i;        p -> pNext = pHead;        pHead = p;    }       return pHead;}void display(struct node *pHead){    while( pHead != NULL)    {           printf("%d ", pHead->val);        pHead = pHead->pNext;    }       printf("\n");}//递归实现struct node * reverse(struct node *pHead){    if (pHead == NULL || pHead -> pNext == NULL)    {           return pHead;    }       struct node *p = pHead -> pNext;    struct node *pNewHead =  reverse(p);    p -> pNext = pHead;    pHead ->pNext = NULL;    return pNewHead;}//尾递归实现struct node * do_reverse_tail(struct node *pHead, struct node *pNewHead){    if(pHead == NULL)    {        return pNewHead;    }    else    {        struct node *pNext = pHead->pNext;        pHead->pNext = pNewHead;        return do_reverse_tail(pNext, pHead);    }}struct node * reverse_tail(struct node *pHead){    return do_reverse_tail(pHead, NULL);}//迭代实现struct node * reverse_it(struct node *pHead){    struct node *pNewHead = NULL;    struct node *pPrev = NULL;    struct node *pCur = pHead;    while(pCur != NULL)    {        struct node *pTmp = pCur->pNext;        if(pTmp == NULL)        {            pNewHead = pCur;        }        pCur->pNext = pPrev;        pPrev = pCur;        pCur = pTmp;    }    return pNewHead;}int main(){    struct node *pHead = gen();    display(pHead);    pHead = reverse_it(pHead);    display(pHead);}



5 0