题目地址(206. 反转链表)
https://leetcode-cn.com/problems/reverse-linked-list/
题目描述
反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->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; }
}
思路
- 思路一:头插法(迭代)
- 思路二:递归
关键点
- 可以尝试画图理清节点与节点之间的关系
a = b;
a = b.next;
a.next = b;
a.next = b.next;
代码
- 语言支持:Java
Java Code:
方法一:头插法(迭代)
class Solution {
public ListNode reverseList(ListNode head) {
ListNode newHead = new ListNode(-1);
while (head != null) {
ListNode next = head.next;
head.next = newHead.next;
newHead.next = head;
head = next;
}
return newHead.next;
}
}
复杂度分析
令 n 为数组长度。
- 时间复杂度: O ( n ) O(n) O(n)
- 空间复杂度: O ( n ) O(n) O(n)
起始状态
1.定义newHead
ListNode newHead = new ListNode(-1);
2.定义next
next = head.next;
3.第一个节点指向null
head.next = newHead.next;
4.newHead指向头节点
newHead.next = head;
5.head往后移动
head = next;
next = head.next;
全过程
public ListNode reverseList(ListNode head) {
ListNode newHead = new ListNode(-1);
while (head != null) {
ListNode next = head.next;
head.next = newHead.next;
newHead.next = head;
head = next;
}
return newHead.next;
}
方法二:递归
public ListNode reverseList(ListNode head) {
if (head == null || head.next == null) {
return head;
}
ListNode next = head.next;
ListNode newHead = reverseList(next);
next.next = head;
head.next = null;
return newHead;
}