原题地址: . - 力扣(LeetCode)
给你单链表的头节点 head
,请你反转链表,并返回反转后的链表。
示例 1:
输入:head = [1,2,3,4,5] 输出:[5,4,3,2,1]
题目解析
链表(Linked List)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer)。
由于不必须按顺序存储,链表在插入的时候可以达到 O(1)的复杂度,比另一种线性表 —— 顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要 O(n) 的时间,而顺序表相应的时间复杂度分别是 O(n) 和 O(1)。
链表允许插入和移除表上任意位置上的节点,但是不允许随机存取。链表有很多种不同的类型:单向链表,双向链表以及循环链表。
迭代
链表的节点结构ListNode已经定义好,我们发现,反转链表的过程,其实跟val没有关系,只要把每个节点的next指向之前的节点就可以了。
public class ReverseList {@Testpublic void test() {ListNode head = new ListNode(1);ListNode next1 = new ListNode(2);ListNode next2 = new ListNode(3);head.next = next1;next1.next = next2;ListNode list = reverseList(head);System.out.println(list);}public ListNode reverseList(ListNode head) {ListNode curr = head;ListNode prev = null;while (curr != null) {ListNode tempNext = curr.next;curr.next = prev;prev = curr;curr = tempNext;}return prev;}public static 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 reverseList(ListNode head) {if (head == null || head.next == null){return head; }ListNode restHead = head.next; ListNode reversedRest = reverseList(restHead); // 递归反转 restHead.next = head; head.next = null; return reversedRest;
}