题目描述
Given a linked list, swap every two adjacent nodes and return its head.
For example,
Given1->2->3->4, you should return the list as2->1->4->3.
Your algorithm should use only constant space. You may not modify the values in the list, only nodes itself can be changed.
解法
- 交换链表中相邻的两个节点,会导致头指针的位置发生变化,因此首先new一个dummy节点接在head节点前面
- 用left和right表示要交换的两个相邻节点,每次交换不仅会影响到left和right的next指针,还会影响到left的前一个节点pre的next指针以及利用到right的后一个节点nxt,因此需要每次交换要处理四个指针
- 解答这道题时应注意对空指针进行处理
- 代码实现
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *swapPairs(ListNode *head) {
if(head == nullptr)
return nullptr;
ListNode* dummy = new ListNode(-1);
dummy -> next = head;
ListNode* pre = dummy;
ListNode* left = head;
ListNode* right = head -> next;
while(right) {
ListNode* nxt = right -> next;
if(pre)
pre -> next = right;
right -> next = left;
left -> next = nxt;
pre = left;
left = nxt;
if(left)
right = left -> next;
else
right = nullptr;
}
ListNode* res = dummy -> next;
delete dummy;
return res;
}
};