代码随想录笔记_链表
代码随想录二刷笔记记录
LC206.反转链表
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
示例 1:
输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]
示例 2:
输入:head = [1,2]
输出:[2,1]
示例 3:
输入:head = []
输出:[]
思路:占位节点 post ,指向当前节点的后一个节点,当前节点 cur,指向cur 之前的节点 pre
post:为 cur 下一次遍历要走的位置进行占位.
pre 作为 cur 反转指向的节点
代码实现
1.迭代法
迭代直到 cur 走到 null 则终止
//迭代
public ListNode reverseList(ListNode head) {
//特判:头节点为空
if (head == null){
return null;
}
return reverse(head);//迭代
}
//迭代函数
public ListNode reverse(ListNode cur){
if (cur == null){
return null;
}
ListNode post = null;
ListNode pre = null;
while (cur != null){
post = cur.next;
cur.next = pre;
pre = cur;
cur = post;
}
return pre;
}
2.递归法
public ListNode reverseList(ListNode head) {
if (head == null){
return null;
}
//递归
return reverse2(null,head);
}
//递归函数
public ListNode reverse2(ListNode pre,ListNode cur){
if (cur == null){
return pre;
}
ListNode post = cur.next;
cur.next = pre;
pre = cur;
cur = post;
ListNode res = reverse2(pre, cur);
return res;
}
链表节点的数据结构
private class ListNode{
int val; //节点数值
ListNode next; //指向下一个节点的指针
//构造器
ListNode(){
}
ListNode(int val){
this.val = val;
}
ListNode(int val,ListNode next){
this.val = val;
this.next = next;
}
}