其他分享
首页 > 其他分享> > LeetCode 0206 Reverse Linked List

LeetCode 0206 Reverse Linked List

作者:互联网

原题传送门

1. 题目描述

2. Solution 1

1、思路分析
方法一: 遍历,逐个摘下结点,头插到新链表

2、代码实现

package Q0299.Q0206ReverseLinkedList;

import DataStructure.ListNode;

public class Solution1 {

    /*
       方法一: 遍历,逐个摘下结点,头插到新链表
      */
    public ListNode reverseList(ListNode head) {
        ListNode p, r;  // p 为工作指针,r为p后继,防断链
        p = head;
        ListNode dummy = new ListNode(0);
        while (p != null) {
            r = p.next;
            p.next = dummy.next;
            dummy.next = p;
            p = r;
        }
        return dummy.next;
    }
}

3、复杂度分析
时间复杂度: O(n)
空间复杂度: O(1)

3. Solution 2

1、思路分析
方法二: 设pre、p和r指向3个相邻的结点,假设经过若干的操作后,pre之前的结点指针都已调整完毕。现在令p结点的next域指向pre,注意到一旦调整指针的指向后,p的后继结点就会断链,为此需要用r来指向原p的后继。

注意:
在处理第一个结点时,应将其next域置为NULL,而不是指向头结点(因为它是结果链表的尾结点);

a) 初始态

对应操作

ListNode pre = null, p = head, r = p.next;
p.next = null;

b) 反转操作

对应操作

pre = p;
p = r;
r = r.next;
p.next = pre;

可以看到,r是下一个待处理的结点,所以退出迭代循环的条件是r为空。

2、代码实现

package Q0299.Q0206ReverseLinkedList;

import DataStructure.ListNode;

public class Solution2 {
    /*
      方法二: 设pre、p和r指向3个相邻的结点,假设经过若干的操作后,pre之前的结点指针都已调整完毕。
      现在令p结点的next域指向pre,注意到一旦调整指针的指向后,p的后继结点就会断链,为此需要用r
      来指向原p的后继。
      注意:
      在处理第一个结点时,应将其next域置为NULL,而不是指向头结点(因为它是结果
      链表的尾结点);
     */
    public ListNode reverseList(ListNode head) {
        if (head == null || head.next == null) return head;
        ListNode pre, p = head, r = p.next;
        p.next = null;
        while (r != null) {
            pre = p;
            p = r;
            r = r.next;
            p.next = pre;
        }
        return p;
    }
}

3、复杂度分析
时间复杂度: O(n)
空间复杂度: O(1)

4. Solution 3

1、思路分析
Solution 2的递归实现。

2、代码实现

package Q0299.Q0206ReverseLinkedList;

import DataStructure.ListNode;

/*
   method 3: recursive solution
 */
public class Solution3 {
    public ListNode reverseList(ListNode head) {
        return reverseListAux(head, null);
    }

    private ListNode reverseListAux(ListNode p, ListNode pre) {
        if (p == null) return pre;
        ListNode r = p.next;
        p.next = pre;
        return reverseListAux(r, p);
    }
}

3、复杂度分析
时间复杂度: O(n)
空间复杂度: O(n)

标签:pre,结点,ListNode,复杂度,List,head,next,0206,Linked
来源: https://www.cnblogs.com/junstat/p/16339970.html