题目描述
反转一个单链表
样例
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
算法1
递归
reverseList(head)
的作用是把所有由head
指向的所有节点进行反转,可以把后面n - 1
个结点看成一个整体,先进行反转得到tail
链表,再把第一个结点拼在tail
链表的尾部,且第一个结点最后指向null
时间复杂度 $O(n)$
空间复杂度 $O(n)$
Java 代码
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode reverseList(ListNode head) {
if(head == null || head.next == null) return head;
ListNode tail = reverseList(head.next);
head.next.next = head;
head.next = null;
return tail;
}
}
算法2
迭代
- 1、若枚举到
b
位置,需要将b.next
指向a
- (1)、
b.next = a
- (2)、
a
和b
指针同时往后移动1
位
- (1)、
- 2、最后
b
走向null
时,a
在最后一个位置,直接返回a
即可
时间复杂度 $O(n)$
空间复杂度 $O(1)$
Java 代码
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode reverseList(ListNode head) {
if(head == null) return head;
ListNode a = head,b = a.next;
while(b != null)
{
ListNode c = b.next;
b.next = a;
a = b;
b = c;
}
head.next = null;
return a;
}
}