文章目录
- 2.反转链表
- 2.1题目
- 2.2解法
- 2.2.1双指针法
- 2.2.2递归法
2.反转链表
2.1题目
206.反转链表——力扣链接
给你单链表的头节点 head
,请你反转链表,并返回反转后的链表。
- 示例一:
输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]
- 示例二:
输入:head = [1,2]
输出:[2,1]
2.2解法
- 一共有两种解法:双指针法、递归法
2.2.1双指针法
- 定义两个指针pre和cur
- pre初始化为Null
- cur初始化为head,cur为即将被反转的元素
- 开始反转:
- 使用tmp保存 cur.next,即cur的下一个节点
- 反转:cur.next=pre,即指向上一个节点
- 往后移动pre指针:pre=cur
- 往后移动cur指针:cur=tmp
- 最后返回pre,即原来的最后一个节点
/**
* Definition for singly-linked list.
* 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; }
* }
*/
class Solution {
public ListNode reverseList(ListNode head) {
ListNode tmp;
ListNode pre=null;
ListNode cur=head;
while(cur!=null){
tmp=cur.next;
cur.next=pre;
pre=cur;
cur=tmp;
}
return pre;
}
}
2.2.2递归法
递归法相对抽象一些,但是其实和双指针法是一样的逻辑,同样是当cur为空的时候循环结束,不断将cur指向pre的过程。
关键是初始化的地方,可以看到双指针法中初始化 cur = head,pre = NULL,在递归法中可以从如下代码看出初始化的逻辑也是一样的,只不过写法变了。
/**
* Definition for singly-linked list.
* 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; }
* }
*/
class Solution {
public ListNode reverseList(ListNode head) {
//方法二:递归
return reverse(null,head);
}
//反转:将cur指向pre
private ListNode reverse(ListNode pre,ListNode cur){
if(cur==null){
return pre; //最后一个节点
}
ListNode tmp=cur.next;
cur.next=pre;
// pre=cur
// cur=tmp
return reverse(cur,tmp); //反转:将tmp执行cur
}
}