24. 两两交换链表中的节点
- 链表的题目通常可以通过画过程示意图解决
- 节点虽然入栈了,但是栈中节点之间的指向仍是不变的
/**
* 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;
}
};