LeetCode 206.反转链表4种方法图解(①就地反转②头插法③迭代法④递归法)Java语言

LeetCode 206.反转链表4种方法图解(①就地反转②头插法③迭代法④递归法)Java语言

输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
进阶:
你可以迭代或递归地反转链表。你能否用两种方法解决这道题?

①就地反转

LeetCode 206.反转链表4种方法图解(①就地反转②头插法③迭代法④递归法)Java语言_第1张图片
LeetCode 206.反转链表4种方法图解(①就地反转②头插法③迭代法④递归法)Java语言_第2张图片
LeetCode 206.反转链表4种方法图解(①就地反转②头插法③迭代法④递归法)Java语言_第3张图片
就地反转即:不增加新的链表在该链表上进行反转
原链表:dummy->1->2->3->4->5
循环一次:dummy->2->1->3->4->5
循环二次:dummy->3->2->1->4->5
循环三次:dummy->4->3->2->1->5
循环四次:dummy->5->4->3->2->1

代码如下:

// 1.就地反转法
    public ListNode reverseList1(ListNode head) {
        if (head == null)
            return head;
        ListNode dummy = new ListNode(-1);
        dummy.next = head;
        ListNode p = dummy.next;
        ListNode q = p.next;
        while (q != null) {
            p.next = q.next;
           q.next = dummy.next;
            dummy.next = q;
            q = p.next;
        }
        return dummy.next;
    }

②头插法

新建单链表
初始状态如下:
LeetCode 206.反转链表4种方法图解(①就地反转②头插法③迭代法④递归法)Java语言_第4张图片
LeetCode 206.反转链表4种方法图解(①就地反转②头插法③迭代法④递归法)Java语言_第5张图片

// 2.新建链表,头节点插入法
    public ListNode reverseList2(ListNode head) {
        ListNode dummy = new ListNode(-1);
        ListNode pCur = head;
        while (pCur != null) {
            ListNode pNex = pCur.next;
            pCur.next = dummy.next;
            dummy.next = pCur;
            pCur = pNex;
        }
        return dummy.next;
    }

③迭代法

public ListNode reverseList(ListNode head) {
        ListNode prev = null;
        while(head!=null){
            ListNode tmp = head.next;
            head.next = prev;
            prev = head;
            head = tmp;
        }
        return prev;
    }    

④递归法

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

第一次写博客,有很多不足,希望大家批评指正!

你可能感兴趣的:(Leecode算法研究)