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:
- 和My Thinking相同
- 使用递归,从最后一个结点开始,每次都改变该结点的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;//返回链表的第一个结点
}
}