LeetCode_206

LeetCode_206

  • 题意以及限制条件
  • 想到的所有可能解法
  • 对应的代码
  • 测试样例

题意以及限制条件

  1. 题目:LeetCode_206_第1张图片

  2. 限制条件:A linked list can be reversed either iteratively or recursively. Could you implement both?

想到的所有可能解法

  • Ways_1——迭代法:双指针

    1. 时间复杂度——O(n);空间复杂度——O(1);
    2. nextNode:用来转置链表中结点的next域指向以及指向所有转置完成后的第一个结点;
    3. next:用于移动head指针,直到head == null。
  • Ways_2——递归1

    1. 时间复杂度——O(n);空间复杂度——O(n);
    2. Ps: (head == null)-针对的是:空链表的输入;(head.next == null)-针对的是:大多数正常链表的输入情况。
  • Ways_3——递归2

    1. 时间复杂度——O(n);空间复杂度——O(n)。

对应的代码

  • Ways_1
class Solution {
     
    public ListNode reverseList(ListNode head) {
     

        ListNode newNode = null;
        while (head != null) {
     
            ListNode next = head.next;
            head.next = newNode;
            newNode = head;
            head = next;
        }
        return newNode;

    }
}
  • Ways_2
class Solution {
     
    public ListNode reverseList(ListNode head) {
     

        //Terminator
        if (head == null || head.next == null) 
            return head;
        //Drill Down
        ListNode newNode = reverseList(head.next);
        //Current Logic
        head.next.next = head;
        head.next = null;
        return newNode;
        //Restore Current Data

    }
}
  • Ways_3
class Solution {
     
    public ListNode reverseList(ListNode head) {
     

       return reverse(head, null);

    }

    public static ListNode reverse(ListNode head, ListNode newNode) {
     
        //Terminator
        if (head == null) 
            return newNode;
        //Current Logic
        ListNode next = head.next;
        head.next = newNode;
        //Drill Down
        return reverse(next, head);
        //Restore Current Data
    }

}

测试样例

LeetCode_206_第2张图片

你可能感兴趣的:(LeetCode,算法,链表,数据结构,java,leetcode)