题目
反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
我的思路:因为对java链表不太熟悉,所以我直接查看了题解。
方法一:迭代法:目前已知最优解,时间O(n),空间O(1)。
先设置一个前置指针prev,指向前面一个结点(第一个prev指向null),
创建一个next指针记录下当前结点curr的next结点,将当前结点curr的next指针指向prev结点,然后就让当前结点curr的下一个结点(先用next记录)成为当前结点,然后next指针指向现在的当前结点的下一个结点,依次交换,直到当前结点等于空节点。PS:最后的当前结点是prev,所以返回的是prev。
class Solution {
public ListNode reverseList(ListNode head) {
ListNode prev=null;
ListNode curr=head;
while(curr!=null){
ListNode next=curr.next;
curr.next=prev;
prev=curr;
curr=next;
}
return prev;
}
}
方法二:递归法(1)递归的三个条件:大问题可以拆成两个子问题;子问题的求解方式和大问题一样;存在最小子问题。
(2)只有两个结点时,要让链表反向,只需要将head的next(即第二个结点)的next指针又指向head,然后断开两个结点之间的链表。head.next=null。
class Solution {
public ListNode reverseList(ListNode head) {
if(head.next==null||head==null){
return head;
}
ListNode newhead=reverseList(head.next);
head.next.next=head;
head.next=null;
return newhead;
}