LinkedList——No.206 Reverse linked list

Problem:

Reverse a singly linked list.

Explanation:

倒转链表。

My Thinking:

从前往后遍历列表,每次改变当前结点后继结点的next,注意需要先将后继结点的next值取出以便继续遍历,时间复杂度为O(n)。

My Solution:

class Solution {
    public ListNode reverseList(ListNode head) {
        ListNode head1=null;
        ListNode head2=head;
        ListNode next=null;
        while(head2!=null){
            next=head2.next;
            head2.next=head1;
            head1=head2;
            head2=next;
        }
        return head1;
    }
}

Optimum Thinking:

  1. 和My Thinking相同
  2. 使用递归,从最后一个结点开始,每次都改变该结点的next,随后让其next(即其原来的前驱结点)继续进行递归,时间复杂度为O(n)

Optimum Solution:

(2)

class Solution {
    public ListNode reverseList(ListNode head) {
       if(head==null||head.next==null)
           return head;
//这是递归的停止条件,返回最后一个未被改变的结点的前一个结点,即第一次返回结点5,因为最后一个未被改变的结点是5的后继null,因此返回null的前一个结点5
        ListNode p=reverseList(head.next);//对每个结点进行递归
        head.next.next=head;//当前需要被改变的结点的后继结点的后继结点,即当前结点4的后继结点5的后继结点改成4
        head.next=null;//为了满足递归条件,将当前结点的后继设为空。
        return p;//返回链表的第一个结点
    }
}

猜你喜欢

转载自blog.csdn.net/qq_41773240/article/details/87948646