反转链表

题目:

  反转一个单链表。

示例:

输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL

准备工作,定义一个ListNode类,作为结点类型:

 

 public class ListNode {
     int val;
     ListNode next;
     ListNode(int x) { val = x; }
 }

 

解法一:头插法

  遍历给定的单链表,然后定义一个Listnode类型的辅助变量,每遍历到一个结点就将该结点赋值给辅助变量,然后指针变量向后移动,将辅助变量指向的结点插入到最前面。

    public ListNode reverseList(ListNode head) {
        
        if (head == null || head.next == null){
            return head;
        }

        ListNode p = head;
        ListNode q = null;
        ListNode temp = null;
        while (p!=null){
            
            temp = p;
            p = p.next;
            temp.next = q;
            q = temp;
        }
        return q;
    }

解法二:递归解决

  反转就是将第一个结点变为最后一个结点,第二个结点变为倒数第二个结点,依次类推,那么可以可采用地递归的方式进行逐个的反转。我们可以将第一个结点后面的所有结点看成一个整体,那么反转就是将第一个结点和后面那个整体调换位置,同样,在这个整体的内部也需要进行反转,那么原始链表中的第二个结点,在当前的这个除第一个结点之外的整体内部算是第一个结点,继续上面的操作,可以达到逐层反转的目的。

public ListNode reverseList(ListNode head) {
    if (head == null || head.next == null) {
        return head;
    }
    ListNode p = head.next;
    ListNode q = reverseList(p);
    p.next = head;
    head.next = null;
    return q;
}

 

posted @ 2020-07-25 07:22  有心有梦  阅读(123)  评论(0编辑  收藏  举报