算法刷题【2】反向链表

题目
反转一个单链表。

示例:

输入: 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;
}
上一篇:LinkedList


下一篇:循环双链表(C语言,使用头节点)