单链表逆序的多种方式

https://www.cnblogs.com/eniac12/p/4860642.html
template<class T>
void List<T>::Inverse()                
{
    if(first == NULL)    return;
    LinkNode<T> *p, *prev, *latter;    
    p = first->link;      // 当前结点
    prev = NULL;          // 前一结点
    latter = p->link;      // 下一结点
    while(p != NULL)
    {
        p->link = prev;      // 当前结点指针指向前一结点
        prev = p;            // 后移
        p = latter;
        if(p != NULL)        // 如果p指针是NULL,已经满足终止条件
            latter = p->link;
    }
    first->link = prev;;    // 最后连上附加头结点
}

复制代码

https://blog.csdn.net/ljyljyok/article/details/77996029

LINK_NODE *ReverseLink(LINK_NODE *head)

   {

       LINK_NODE *next;

        LINK_NODE *prev = NULL;

    

        while(head != NULL)

        {

            next = head->next;

           head->next = prev;

           prev = head;

           head = next;

       }

    

        return prev;

    }

http://www.nowamagic.net/librarys/veda/detail/2241

/* 单链表反转/逆序 */
Status ListReverse(LinkList L)
{
    LinkList current,pnext,prev;
    if(L == NULL || L->next == NULL)
        return L;
    current = L->next;  /* p1指向链表头节点的下一个节点 */
    pnext = current->next;
    current->next = NULL;
    while(pnext)
    {
        prev = pnext->next;
        pnext->next = current;
        current = pnext;
        pnext = prev;
        printf("交换后:current = %d,next = %d \n",current->data,current->next->data);
    }
    //printf("current = %d,next = %d \n",current->data,current->next->data);
    L->next = current;  /* 将链表头节点指向p1 */
    return L;
}

http://www.nowamagic.net/librarys/veda/detail/2242

Status ListReverse2(LinkList L)
{
    LinkList current, p;

    if (L == NULL)
    {
        return NULL;
    }
    current = L->next;
    while (current->next != NULL)
    {
        p = current->next;
        current->next = p->next;
        p->next = L->next;
        L->next = p;
    }
    return L;
}

http://www.nowamagic.net/librarys/veda/detail/2242

Status ListReverse3(LinkList L)
{
    LinkList newList;    //新链表的头结点
    LinkList tmp;       //指向L的第一个结点,也就是要摘除的结点

    //参数为空或者内存分配失败则返回NULL
    if (L == NULL || (newList = (LinkList)malloc(sizeof(Node))) == NULL)
    {
        return NULL;
    }

    //初始化newList
    newList->data = L->data;
    newList->next = NULL;

    //依次将L的第一个结点放到newList的第一个结点位置
    while (L->next != NULL)
    {
        tmp = newList->next;         //保存newList中的后续结点
        newList->next = L->next;       //将L的第一个结点放到newList中
        L->next = L->next->next;     //从L中摘除这个结点
        newList->next->next = tmp;        //恢复newList中后续结点的指针
    }

    //原头结点应该释放掉,并返回新头结点的指针
    free(L);
    return newList;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值