C++(leetcode206|链表反转笔记|思考总结)

ListNode* reverseList(ListNode* head)
{
    if (head == NULL)    //特殊
        return head;
    ListNode* p = head;
    while (head->next!= NULL)//移动到null
    {
        
        ListNode* tmp = head->next->next;

        head->next->next = p;

        p = head->next;

        head->next = tmp;
    }
    return p;
}

这个是比较骚,而且用了很多时间:

启发:

一、写代码之前,不要觉得看懂了就直接开始写,容易这里有错那边有漏

二、写代码前,用笔在纸上先列出以下的元素:

一:每一轮的步骤

二:能实现这样一轮的前提条件是什么,题目给的条件是否(大于)所需条件

三:结束的时候,返回对应的是哪个变量

三、当要将一个结点的next改变的时候,考虑:(要不要存下这个next要不就找不到了)

四、纸笔写代码的时候,箭头代表移动到,则将目标放在左边(这样符合程序赋值格式)

五、如果有找到上一个的需求(使用哨兵是最方便的)

剩下的两个易理解的方式:(双指针+递归)

 递归

思考的误区和启发 

使用一个空指针,不断跟踪pre,则可以顺流索取到每一个要被指向的

cur先靠近pre,pre再顺流

这样pre就能第一个指向(NULL)

cur靠近pre,而pre指向下一个

直到pre == NULL则可以退出

返回的是cur

 递归:

 思考的误区和启发

递归的栈特性:(最后加入的最先弹出)

因为找到的时候,返回的就是最后一个:则可以当作返回的开头(每一个都return开头)

层数的理解:当倒数第二层的时候,此时的实参已经变成了倒数第二层的实参

如:第五层为终止区,则第一次回到的是第二层,则此时的head(4)

因此将此时的(head(4)的next) = (5)的next指向自己head(4)

                        并将head(4)的next指向NULL

周而复始

则最外部的一层就是,将(head(1)的next)  = (2)的next指向自己head(1)

                                       并将head(1)的next指向NULL

完成大业。

引用: id:路漫漫我不畏(leetcode)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值