文章目录
- 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指向preprivate ListNode reverse(ListNode pre,ListNode cur){if(cur==null){return pre; //最后一个节点}ListNode tmp=cur.next;cur.next=pre;// pre=cur// cur=tmpreturn reverse(cur,tmp); //反转:将tmp执行cur}
}