24. 两两交换链表中的节点(链表题可以在函数里自行添加shead)

32 阅读1分钟

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

已解答

中等

相关标签

premium lock icon相关企业

给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。

 

示例 1:

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

示例 2:

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

示例 3:

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

 

提示:

  • 链表中节点的数目在范围 [0, 100] 内
  • 0 <= Node.val <= 100

题解:

bug:交换位置后没注意到left和right和字面意思相反了,还用pre = right来更新值。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* swapPairs(struct ListNode* head) {
    if (head == NULL || head->next == NULL)
    {
        return head;
    }

    struct ListNode* right = head->next;
    struct ListNode* left = head;
    struct ListNode* shead = (struct ListNode*)malloc(sizeof(struct ListNode));
    shead->next = head;
    struct ListNode* pre = shead;
    while (left != NULL && right != NULL)
    {
        left->next = right->next;
        right->next = left;
        pre->next = right;
        pre = left;//---------由于left和right交换了位置,此时left才是位于右边的节点。------------
        if (pre->next != NULL)
        {
            left = pre->next;
        }
        else
        break;
        if (left->next != NULL)
        {
            right = left->next;
        }
        else
        break;
    }
    head = shead->next;
    free(shead);
    shead = NULL;
    return head;

}