24.两两交换链表中的节点

2020/10/24

# Heading

    24.两两交换链表中的节点 (opens new window)

    Tags: algorithms bloomberg microsoft uber linked-list

    Langs: c cpp csharp golang java javascript kotlin php python python3 ruby rust scala swift typescript

    • algorithms
    • Medium (68.19%)
    • Likes: 722
    • Dislikes: -
    • Total Accepted: 188K
    • Total Submissions: 275.4K
    • Testcase Example: '[1,2,3,4]'

    给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。

    你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

    示例 1:

    输入:head = [1,2,3,4]
    输出:[2,1,4,3]
    
    1
    2

    示例 2:

    输入:head = []
    输出:[]
    
    1
    2

    示例 3:

    输入:head = [1]
    输出:[1]
    
    1
    2

    提示:

    • 链表中节点的数目在范围 [0, 100]
    • 0 <= Node.val <= 100
    /*
     * @lc app=leetcode.cn id=24 lang=javascript
     *
     * [24] 两两交换链表中的节点
     */
    
    // @lc code=start
    /**
     * Definition for singly-linked list.
     * function ListNode(val, next) {
     *     this.val = (val===undefined ? 0 : val)
     *     this.next = (next===undefined ? null : next)
     * }
     */
    /**
     * @param {ListNode} head
     * @return {ListNode}
     */
    var swapPairs = function (head) {
        const hair = new ListNode(-1, head);
        let p = hair, q = p.next, r;
        while (q && q.next) {
            //删除q
            p.next = q.next;
            p = p.next;
            if (p.next) {
                //插入q
                r = p.next;
                p.next = q
                q.next = r
                //pq前移
                p = q
                q = q.next
            } else {
                q.next = null;
                p.next = q
            }
        }
        return hair.next
    };
    
    var swapPairs2 = function (head) {
        const hair = new ListNode(0, head);
        let even = 0 //当前是否偶数节点
        let p = hair, q = p ? p.next : null, r = q ? q.next : null;
        while (q) {
            if (even) {
                p.next = r
                q.next = p.next
                p.next = q
    
                p = p.next.next
                q = r
                r = r ? r.next : null
            }
            p = q
            q = r
            r = r ? r.next : null
            even = ~even
        }
        return hair.next
    };
    // @lc code=end
    
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64