Loading

力扣 - 206. 反转链表

题目

206. 反转链表


思路1

  • 迭代方法,在遍历过程中一边遍历,一遍将next指针改变
  • 我们需要一个pre指针记录上一个当前结点的上一个,方便修改
  • 时间复杂度O(n),空间复杂度O(1)

代码实现

class Solution {
    public ListNode reverseList(ListNode head) {
        //记录上一个结点
        ListNode pre = null;
        ListNode cur = head;
        //不为null说明还没到链表尾部
        while (cur != null) {
            //先记录下一个结点
            ListNode n = cur.next;
            //改变当前结点的next指针
            cur.next = pre;
            //cur和pre都后移一位
            pre = cur;
            cur = n;
        }
        //最后不要忘了返回链表的头结点
        return pre;
    }
}

思路2

  • 利用递归解决
  • 递归的终止条件就是到达链表尾部,然后将他作为头节点返回
  • 利用当前结点,设置下一个节点的next为当前节点
  • 同时还要将当前的next指向null,因为最后一个节点要指向null
  • 时间复杂度O(n),空间复杂度O(n)

代码实现

class Solution {
    public ListNode reverseList(ListNode head) {
        //如果是最后一个结点就结束递归,将他作为头结点返回
        if (head == null || head.next == null) {
            return head;
        }
        //设置后一个结点的next指向
        ListNode p = reverseList(head.next);
        head.next.next = head;
        //将当前结点next指向null,这样就不用单独为最后一个结点指定null了
        head.next = null;
        return p;
    }
}
posted @ 2020-10-15 20:05  linzeliang  阅读(88)  评论(0)    收藏  举报