链表逆置

链表逆置可以有很多种方法,

第一种方法,我们知道链表的创建的方法,有一种方法就是插头法,但是插头法有一个缺陷就是,如果你想输出的链表和你想要的顺序是一致的,你需要倒序输入,其实这就是链表的逆置。采用辅助指针,不断获取链表的第一个元素,然后用插头法创建一个新的链表,那么这个链表就是逆置的

void ListReverse_L(LinkList &L)
{
    LNode *p,*tmp;
    p = L->next;
    L -> next = NULL;
    while ( p)
    {
        tmp = p->next;
        p->next = L->next;//后插法
        L->next=p;//然后新链表的头结点指向p
        p = tmp;
    }
}

 这个方法比较好理解,也是很方便。用处很大 

第二种方法,递归

递归的方法也是比较好理解,不断去递归,当你递归到这个链表的最后一个元素的时候递归结束,然后不断把nextptr的next指向curptr 然后把curptr指向空结点就可以,

void reverseList_recur(ListNode *currPos)
{
    // 空链表
    if (currPos == nullptr)
        return;
    if (currPos->next == nullptr)
        return;
    ListNode *nextPos = currPos->next;

    reverseList_recur(nextPos);

    nextPos->next = currPos;//把下一个结点指前面的结点
    currPos->next = nullptr;//把前面的结点指向为空
}
第三种方法,思路跟头插法差不多只是写法上不同,我认为比较难以理解,三种能够灵活掌握两种,就足够了

void reverse(Node *&head)  
{  
    if (head == NULL || head->next==NULL)  //空或者只有一个元素不用逆置  
        return;  
    Node *pre, *cur, *rear;  
    pre = head;  
    cur = head->next;  
    while (cur)  
    {  
        rear = cur->next;  
        cur->next = pre;  
        pre = cur;  
        cur = rear;  
    }  
    //以下两步,很重要  
    head->next = NULL;   //这一步会使新的尾节点的链域置空  
    head = pre;   //head指针指向新的一头  
} 



评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值