C++ LC206 反转链表 个人学习记录

方法1 创建新的虚拟头节点(创建一个新的链表)依次遍历原有链表 将遍历节点依次头插入新链表 即可实现链表反转 返回值为dummy->next

class Solution {
public:
    ListNode* reverseList(ListNode* head) {

        while (head == NULL){
            return NULL;
        }
        
        ListNode *dummy = new ListNode(0);
        while (head != NULL){
            ListNode *temp = head->next;
            head->next = dummy->next;
            dummy->next = head;
            // 头插法 先将head下一个连接到dummy的下一个上 再将dummy->next指向head
            // 为什么是这个顺序 详情见后面链接
            // 这里是对head进行操作 做的操作是把head头插到链表中
            head = temp;
            // head = temp 依次向后一个
        }
        return dummy->next;
        // 返回新的链表 为dummy->next
    }
};

方法2 递归思想

class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        if (head == nullptr || head->next == nullptr) {
            return head;
        }
        // 第一种情况 如果链表是空的 或链表只有head自己 那么就直接返回自己
        ListNode* last = reverseList(head->next);
        // 不要跳进递归 单独看这一句 得到的结果是last这个链表 该链表是
        head->next->next = head;
        // head->next 的下一个重新指向现在的head 相当于把链表顺序修正 配合图更好理解
        head->next = nullptr;
        // head下一个为空 让链表完整
        return last;
        // 输出last 即为翻转后的链表
    }
};

参考:

递归魔法:反转单链表

相关知识学习:

【数据结构】单链表之头插法和尾插法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值