提示:多拿些酒来,因为生命只有乌有。
如果不使用链表的话,很快就能让他反转,不过也没有那么简单(用链表的话)
拿到题目,想一想怎么处理最好
那我们就先画个图吧
再来个过程图,这让就看的懂了:
/**
* 方法1:虚拟结点 ,并复用已有的结点
*
* @param head
* @return
*/
public static ListNode reverseListByDummyNotCreate(ListNode head) {
if(head == null){
return null;
}
ListNode ans = new ListNode(-1);
ListNode cur = head;
while(cur != null){
ListNode next = cur.next; // 所以这里 需要保留一下cur后面的节点
// ans.next = cur.next;
// ans.next = cur; 不能这样写
cur.next = ans.next; // 改变当前节点的指针域 也就是说 现在cur后面的已经断了
// 现在可以说 有两个指针指向 ans 的下一个节点
ans.next = cur; // 更改指针域 下一个 ans 就不指向头节点了
cur = next; // 修改cur当前节点 进行下一次循环
}
return ans.next;
}
这个是经典的解决方法,很常用,一定要数量掌握。
因为上面的方法更容易想到,一般面试官也不建议使用头节点,不使用头节点更体现你对链表的熟悉程度。
那我们就来挑战一下:
我们梳理一下思路:
先画个图hahah
注意:链表的结构
我们来看一下执行期间的流程图:
注意:上面的代码太重要了,建议理解的基础上,刻在骨子里,以后用的地方很多。
这个放到后面解决,目前先不讨论。
这里最主要的是掌握链表反转,【不带头节点的】⭐