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

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

  • 链表的题目通常可以通过画过程示意图解决
  • 节点虽然入栈了,但是栈中节点之间的指向仍是不变

20210823205247

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode *swapPairs(ListNode *head) {
//        0个或1个节点,直接返回
        if (head == nullptr || head->next == nullptr) return head;

        stack < ListNode * > stk;
        ListNode *dummy = new ListNode(-1); // 增加虚拟节点,便于返回结果
        dummy->next = head; // 这句话可有可无
        ListNode *pre = dummy; // pre在后(左边),cur在前(右边)。不断维护栈
        ListNode *cur = head;
        while (cur != nullptr && cur->next != nullptr) {
//            入栈
            stk.push(cur);
            stk.push(cur->next);
            cur = cur->next->next;

//            出栈
            pre->next = stk.top();
            stk.pop();
            pre->next->next = stk.top();
            stk.pop();
            pre = pre->next->next;
            pre->next = cur; // pre跳过两次后,指向cur
        }

//        处理末尾剩下的:可能0个或1个节点
        if (cur != nullptr) { 
            pre->next = cur; // 剩1个节点
        } else
            pre->next = nullptr; // 没剩下节点
//        返回结果    
        return dummy->next;
    }
};

   转载规则


《24-两两交换链表中的节点》 M 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
640-求解方程 640-求解方程
640. 求解方程 示例 : 输入: “x+5-3+x=6+x-2”输出: “x=2” 如果方程没有解,请返回“No solution”。 如0x=10。此时x的系数为0,常数不为0 如果方程有无限解,则返回“Infinite sol
2021-08-26
下一篇 
第三章:如何高效进行模幂运算 第三章:如何高效进行模幂运算
labuladong如何高效进行模幂运算 372. 超级次方先把问题分解为子问题 子问题1:如何高效求幂?对应以下题目: 50. Pow(x, n)快速幂解析(分治法角度) 通过x*x,每次x变为x^2; 通过n//2向下取整,n变为原来
2021-08-20
  目录