LeetCode24 两两交换链表中的节点

61 阅读1分钟

leetcode.cn/problems/sw…

image.png

解法一:递归

如果我设法将前2个节点反转,那么后面的节点怎么处理?其实也是一条链表,只不过长度更小,可以直接递归调用,这就是子问题结构。

image.png

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func swapPairs(head *ListNode) *ListNode {
    if head == nil || head.Next == nil{ // 递归退出条件
        return head
    }
    first := head
    second := head.Next
    others := head.Next.Next
    // 先翻转前两个节点
    second.Next = first
    // 递归翻转后面的两两节点,并接到当前两个节点后面
    first.Next = swapPairs(others)
    // 返回新的头节点
    return second
}

解法二:迭代法

image.png

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func swapPairs(head *ListNode) *ListNode {
    if head == nil || head.Next == nil{
        return head
    }
    dummy := &ListNode{Val:-1, Next:head}
    pre, cur := dummy, head
    for cur != nil && cur.Next != nil{
        // 记录当前两节点翻转后的下一节点
        nxt := cur.Next.Next
        // 执行翻转
        pre.Next = cur.Next
        cur.Next.Next = cur
        cur.Next = nxt
        // 处理下一轮
        pre = cur
        cur = nxt
    }
    return dummy.Next
}