翻转链表的方法

前两天看到一个题目,将链表反转,我的第一思路是将列表放入栈中,然后再依次拿出来。

思想过于简单,我想到说利用数组来实现这个功能。之后查看网上各种大神的方法,做以下几个方法总结。

一、放入数组,数组倒置

void reverse(pnode head, int count)//把链表的节点值放在数组中,倒置数组
{
    int a[5]= {0};

    for(int i=0; i<count,head->pnext!=NULL; i++)
    {
        a[i]=head->pnext->data;
        head=head->pnext;

    }
    for(int j=0,i=count-1; j<count; j++,i--)
        printf("%d\t",a[i]);

}

二、遍历到链表的最后一个节点,将最后一个节点插入头节点的后面,接着循环进行插入,直到只剩下一个节点为止

void ReserveList(pListNode pHead)
{
    pListNode p = pHead;
    pListNode pPre = pHead;
    pListNode pTail = pHead->next;
    while (p->next->next != NULL)
    {
        while (pTail->next)
        {
            pPre = pTail;
            pTail = pTail->next;
        }
        pPre->next = NULL;
        pTail->next = p->next;
        p->next = pTail;
        p = pTail;
    }
}

三、首先定义三个指分别 Pre(表示当前指针的前驱初值为NULL),pCur(当前节点指针),pNext(当前节点的下一个指针),每当当前指针不为空时就会把当前指针指向前驱指针,直到当前指针为空。

void ReserveList(pListNode pHead)
{
    pListNode pre = NULL;
    pListNode pNext = NULL;
    pListNode pCur = pHead->next;
    while (pCur)
    {
        pNext = pCur->next;
        pCur->next = pre;
        pre = pCur;
        pCur = pNext;
    }
    pHead->next = pre;
}

四、递归:当求全部链表的翻转时,只要把除当前指针外后面的指针翻转,然后再把当前指针放在翻转后的指针后面就行了,即把链表从更大范围翻转缩小更小范围

pListNode ReserveList(pListNode  p, pListNode pStaticHead)
{   
    if (pStaticHead == NULL)
    {
        return NULL;
    }
    if (p->next == NULL)
    {
        pStaticHead->next = p;
        return p;
    }
    else
    {
        pListNode temp = ReserveList(p->next,pStaticHead);
        temp->next = p;
        p->next = NULL;
        return p;
    }
}

https://blog.csdn.net/qq_36675830/article/details/78064488?readlog

https://blog.csdn.net/qq_36675830/article/details/78064488?readlog

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值