Loading

反转链表

1.问题描述

反转一个单链表。

示例:

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

2.求解

迭代双指针

  • 定义前指针cur和后指针pre
  • 每次让pre的next指向cur
  • 完成后两个指针向分别后移动一位

代码如下

    /*
     执行用时:0 ms, 在所有 Java 提交中击败了100.00% 的用户
     内存消耗:38 MB, 在所有 Java 提交中击败了91.05% 的用户
    */
	public ListNode reverseList(ListNode head) {
        ListNode cur = null;
        ListNode pre = head;
        while(pre != null){
            ListNode temp = pre.next;
            pre.next = cur;
            cur = pre;
            pre = temp;
        }
        return cur;
    }
  • 时间复杂度:O(n)
  • 空间复杂度:O(1)

迭代双指针二

代码如下

    /*
    执行用时:0 ms, 在所有 Java 提交中击败了100.00% 的用户
    内存消耗:38.1 MB, 在所有 Java 提交中击败了84.86% 的用户
    */
	public ListNode reverseList(ListNode head) {
        if(head == null){
            return null;
        }
        ListNode cur = head;
        while(head.next != null){
            ListNode temp = head.next.next;
            head.next.next = cur;
            cur = head.next;
            head.next = temp;
        }
        return cur;
    }

递归

  • 先递归到尾节点记为ret
  • 返回过程中对每一个节点执行以下操作
    1. 令当前节点的下一个节点指向该节点
    2. 令当前节点指向null

代码如下

    /*
    执行用时:0 ms, 在所有 Java 提交中击败了100.00% 的用户
    内存消耗:38.4 MB, 在所有 Java 提交中击败了62.07% 的用户
    */
	public ListNode reverseList(ListNode head) {
        if(head == null || head.next == null){
            return head;
        }
        ListNode ret = reverseList(head.next);
        head.next.next = head;
        head.next = null;
        return ret;
    }
  • 时间复杂度:O(n)
  • 空间复杂度:O(n)
posted @ 2020-12-08 20:30  水纸杯  阅读(72)  评论(0)    收藏  举报