反转链表(两种方法)

反转链表

题干

在这里插入图片描述

1. 直接在链表上进行反转

在这里插入图片描述

SListNode* reverseList2(SListNode* head){
    if(head == NULL || head->next == NULL)
    {
        return head;
    }
    SListNode* n1 = NULL;
    SListNode* n2 = head;
    SListNode* n3 = head->next;
    while(n2)
    {
        // 反转
        n2->next = n1;
        // 移动指针
        n1 = n2;
        n2 = n3;
        if(n3)
            n3 = n3->next;
    }
    return n1;
}

2. 头插法

当链表中的数据大于等于二的时
1地址 2地址 3地址 4地址 现在需要倒着
4地址 3地址 2地址 1地址 从最后一位开始看就相当于一直进行头插
进行头插得过程中prev始终指向的就是反转过程中的头节点,cur一直向后移动
在这里插入图片描述

SListNode* reverseList(SListNode* head){
    if (head == NULL)
    {
       return NULL;
    }
    else if(head->next == NULL)
    {
        return head;
    }
    // 当链表中的数据大于等于二的时
    // 1地址 2地址 3地址 4地址 现在需要倒着
    // 4地址 3地址 2地址 1地址 从最后一位开始看就相当于一直进行头插
    // 进行头插得过程
    else{
        SListNode* prev = head;
        SListNode* cur = head->next;
        // 定义一个tempnode用来存储cur指向的下一个节点
        // 当cur本身为空时循环结束
        while(cur)
        {
            SListNode* tempNode = cur->next;
            cur->next = prev;
            prev=cur;
            cur = tempNode;
        }
        // 这个时候还有最后一个没有反转prev在头部 cur在尾部
        head->next = NULL;
        // 最后prev指向的就是反转后的头节点
        return prev;
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值