LeetCode第二十四题(两两交换链表中的节点)

119 阅读1分钟

三指针法(迭代)

核心思想:

image.png

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode swapPairs(ListNode head) {
        if(head == null || head.next == null)//空链表或只有头结点的链表
            return head;
        ListNode resList = new ListNode(0, head);//结果链表的理论头结点
        ListNode left = resList;//交换结点的相邻前一个结点
        ListNode mid = head;//交换结点中的前一个结点
        ListNode right = head.next;///交换结点中的后一个结点
        while(right != null){
            mid.next = right.next;
            right.next = mid;
            left.next = right;
            left = mid;//下一对交换结点的相邻前一个结点
            if(mid.next != null)
                mid = mid.next;
            right = mid.next;
        }
        return resList.next;
    }
}

递归解法

核心思想: 递归的终止条件为链表为空链表或者链表只有一个头结点,否则新头结点newHead指向旧头结点head,而旧头结点head指向链表中其余结点交换后的结果(由递归完成)

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode swapPairs(ListNode head) {
        if(head == null || head.next == null)//终止条件
            return head;
        ListNode newHead = head.next;//新头结点
        head.next = swapPairs(newHead.next);//旧头结点head指向链表中其余结点交换后的结果
        newHead.next = head;//新头结点指向旧头结点
        return newHead;
    }
}