学习目标:
本次学习目标为 力扣初级算法-链表,其中主要的LC如下:
- 反转链表
学习内容:
- 反转链表-----(链接)
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。示例1:
输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]示例2:
输入:head = [1,2]
输出:[2,1]示例3:
输入:head = []
输出:[]
解题思路:
-
解法一: 使用栈解决
-
边界问题:入参链表 head next 为空
-
代码逻辑过程:
- 将链表的所有链表节点 push 到栈中
- 考虑边界问题: 入参链表 head next 为空
- 对栈中的所有元素进行出栈,并递归下一个
- 后一个结点就是反转前的头结点,一定要让他的next 等于空,否则会构成环
-
代码实现:
// 解法一: 使用栈解决
public class ListNode {
int val;
ListNode next;
ListNode() {
}
ListNode(int val) {
this.val = val;
}
ListNode(int val, ListNode next) {
this.val = val;
this.next = next;
}
}
public ListNode reverseList01(ListNode head) {
Stack<ListNode> stack = new Stack<>();
// 将链表的所有链表节点 push 到栈中
while (null != head) {
stack.push(head);
head = head.next;
}
// 边界问题:入参链表 head next 为空
if (stack.isEmpty()) {
return null;
}
ListNode node = stack.pop();
ListNode reverse = node;
// 对栈中的所有元素进行出栈,并递归下一个
while (!stack.isEmpty()) {
node.next = stack.pop();
node = node.next;
}
//最后一个结点就是反转前的头结点,一定要让他的next
//等于空,否则会构成环
node.next = null;
return reverse;
}
解题思路:
-
解法二:
-
边界问题: 双链表解法
-
代码逻辑过程:
- 将当前节点作为最后返回链表 node 的下一个节点,倒置过来
- 在返回的链表中,当前节点作为原链表中的next
- 将当前的结果赋值到返回的链表中
- 重新赋值,继续访问
-
代码实现:
public class ListNode {
int val;
ListNode next;
ListNode() {
}
ListNode(int val) {
this.val = val;
}
ListNode(int val, ListNode next) {
this.val = val;
this.next = next;
}
}
/***
* 解法二: 双链表解法
* 原理: 两链表的 next 反过来
*/
public ListNode reverseList02(ListNode head) {
ListNode node = null;
while (null != head){
ListNode tempNode = head.next;
// 将当前节点作为最后返回链表 node 的下一个节点,倒置过来,
// 在返回的链表中,当前节点作为原链表中的next
head.next = node;
// 将当前的结果赋值到返回的链表中
node = head;
// 重新赋值,继续访问
head = tempNode;
}
return node;
}