链表反转的意义
反转链表涉及到节点的增加、删除等多种操作,能非常有效地考察思维能力和代码驾驭能力。另外,很多题目也以它来做基础,例如指定区间反转,链表K个一组反转等;除此之外,还有一些在内部的某个过程用到了反转,例如两个链表生成相加链表;最后还有链表排序。
必须掌握的两种链表反转
- 带虚拟头节点的链表反转
- 不带虚拟头节点的链表反转
题目描述
给你单链表的头节点head,请你反转链表,并返回反转后的链表
示例:
输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]
图示
题目所要效果如下图所示
实现方式
1.带虚拟头节点的链表反转
解题思路
虚拟头节点能够解决链表头节点的处理问题(如判空等),建立一个虚拟头节点ans,并将虚拟头节点与旧的头节点产生关系(ans.next = 旧的头节点),接下来就可将旧的链表通过旧的头节点一步一步拆下来并接到虚拟头节点ans后面
思路图例
实现步骤如下:
代码实现
public Node reverseList(Node head){
Node ans = new Node(0);
Node cur = head;
while(cur != null){
Node next = cur.next;
cur.next = ans.next;
ans.next = cur;
cur = next;
}
return ans.next;
}
2.带虚拟头节点的链表反转
实现思路
也是通过拆分链表节点的方式实现的。定义一个空的链表头节点(不是虚拟节点,其值为null),然后将旧的链表节点通过拆分的方式接入这个空的链表头节点中。
思路图例
实现效果图:
节点4的执行过程图:
代码实现
public Node reverseList(Node head){
Node pre = null;
Node cur = head;
while(cur != null){
Node next = cur.next;
cur.next = pre;
pre = cur;
cur = next;
}
return pre;
}
至此结束,OVER!!! 掌握咯