leetcode刷题(3)——206.反转链表

一、题目

反转一个单链表。

示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL

进阶:
你可以迭代或递归地反转链表。你能否用两种方法解决这道题?

二、思路及代码实现

方法一:迭代

在遍历链表时,将当前节点的 next 指针改为指向前一个元素。由于节点没有引用其上一个节点,因此必须事先存储其前一个元素。在更改引用之前,还需要另一个指针来存储下一个节点。不要忘记在最后返回新的头引用!

代码如下:

public ListNode reverseList(ListNode head){
    ListNode pre = null;
    ListNode cur = head;
    while(cur != null){
	ListNode temp = cur.next;
	cur.next = pre;
	pre = cur;
	cur = temp;
    }
    return pre;
}

复杂度分析:

时间复杂度:O(n),假设 n 是链表的长度,时间复杂度是 O(n)。
空间复杂度:O(1)。

方法二:递归

递归就是将目前复杂的问题转换为较为简单的同类问题,在这里就是先对链表的子链表进行反转,最后解决整个链表的反转。过程如下:

假设初始链表为(头节点 head 指向 n 1 n_1 ):
n 1 n 2 n 3 . . . n m n_1 \rightarrow n_{2} \rightarrow n_{3} \rightarrow ... \rightarrow n_{m} \rightarrow \emptyset 执行 reverseList(head.next),对除头节点以外的子链表进行反转,应该得到:
n 1 n 2 n 3 . . . n m n_1 \rightarrow n_{2} \leftarrow n_{3} \leftarrow ... \leftarrow n_{m} 此时只需改变 n 1 n_1 n 2 n_2 的指向,即

head.next.next = head;

最后还要让 n 1 n_1 的 next 指向 null,即

head.next = null;

代码如下:

public ListNode reverseList(ListNode head) {
    if (head == null || head.next == null)
    	return head;
    ListNode p = reverseList(head.next);
    head.next.next = head;
    head.next = null;
    return p;
}

复杂度分析:

时间复杂度:O(n),假设 n 是链表的长度,那么时间复杂度为 O(n)。
空间复杂度:O(n),由于使用递归,将会使用隐式栈空间。递归深度可能会达到 n 层。

发布了56 篇原创文章 · 获赞 0 · 访问量 938

猜你喜欢

转载自blog.csdn.net/weixin_45594025/article/details/104907136