目录
反转链表
描述
示例 1
示例 2
示例 3
提示
数据结构
方法一:迭代(双指针)
方法二:递归
描述
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
示例 1
输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]
示例 2
输入:head = [1,2]
输出:[2,1]
示例 3
输入:head = []
输出:[]
提示
- 链表中节点的数目范围是 [0, 5000]
- -5000 <= Node.val <= 5000
数据结构
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; }
}
方法一:迭代(双指针)
我们定义一个pre指针,指向当前节点的前一个节点,初始化为null;
再定义一个cur指针,指向当前节点,初始化为head;
我们每次迭代的时候,先将cur.next存储到next变量中,然后将pre和cur的位置颠倒,即cur.next=pre,然后更新pre和cur指针,二者均后移。
class Solution {
public ListNode reverseList(ListNode head) {
ListNode pre=null,cur=head,next;
while (cur!=null){
next=cur.next;
cur.next=pre;
pre=cur;
cur=next;
}
return pre;
}
}
方法二:递归
?递归的方法其实也很简单,我们直接递归到最后一个节点开始反转。
我们假设倒数第二个节点为pre,最后一个节点为cur,那么如果要完成反转就是让cur.next=pre,而又有pre.next=cur,所以我们可以简化式子为pre.next.next=pre,但是此时要将pre.next置空,否则会产生环。
class Solution {
public ListNode reverseList(ListNode head) {
if (head==null||head.next==null) return head;
ListNode reverseNode=reverseList(head.next);
head.next.next=head;//将当前节点放置在下一个节点的next处,即完成倒置
head.next=null;//当前节点处于反转链表的末尾,需要将末尾置空,否则会产生环
return reverseNode;//返回当前反转链表的头节点
}
}
|