畫解算法:24. 兩兩交換鏈表中的節點

題目連接

leetcode-cn.com/problems/sw…java

題目描述

給定一個鏈表,兩兩交換其中相鄰的節點,並返回交換後的鏈表。node

你不能只是單純的改變節點內部的值,而是須要實際的進行節點交換。算法

示例:bash

給定 1->2->3->4, 你應該返回 2->1->4->3.
複製代碼

解題方案

思路

  • 標籤:鏈表
  • 本題的遞歸和非遞歸解法其實原理相似,都是更新每兩個點的鏈表形態完成整個鏈表的調整
  • 其中遞歸解法能夠做爲典型的遞歸解決思路進行講解

遞歸寫法要觀察本級遞歸的解決過程,造成抽象模型,由於遞歸本質就是不斷重複相同的事情。而不是去思考完整的調用棧,一級又一級,無從下手。如圖所示,咱們應該關注一級調用小單元的狀況,也就是單個f(x)。spa

fr<x>ame_00007.png

其中咱們應該關心的主要有三點:指針

  1. 返回值
  2. 調用單元作了什麼
  3. 終止條件

在本題中:code

  1. 返回值:交換完成的子鏈表
  2. 調用單元:設須要交換的兩個點爲head和next,head鏈接後面交換完成的子鏈表,next鏈接head,完成交換
  3. 終止條件:head爲空指針或者next爲空指針,也就是當前無節點或者只有一個節點,沒法進行交換

代碼

遞歸解法cdn

class Solution {
    public ListNode swapPairs(ListNode head) {
        if(head == null || head.next == null){
            return head;
        }
        ListNode next = head.next;
        head.next = swapPairs(next.next);
        next.next = head;
        return next;
    }
}
複製代碼

非遞歸解法blog

class Solution {
    public ListNode swapPairs(ListNode head) {
        ListNode pre = new ListNode(0);
        pre.next = head;
        ListNode temp = pre;
        while(temp.next != null && temp.next.next != null) {
            ListNode start = temp.next;
            ListNode end = temp.next.next;
            temp.next = end;
            start.next = end.next;
            end.next = start;
            temp = start;
        }
        return pre.next;
    }
}
複製代碼

畫解

fr<x>ame_00001.png
fr<x>ame_00002.png
fr<x>ame_00003.png
fr<x>ame_00004.png
fr<x>ame_00005.png
fr<x>ame_00006.png

後臺回覆「算法」,加入每天算法羣 以爲算法直擊靈魂,歡迎點擊在看轉發遞歸

相關文章
相關標籤/搜索