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
完成大业。