题目描述(Medium)
Given a linked list, swap every two adjacent nodes and return its head.
题目链接
https://leetcode.com/problems/swap-nodes-in-pairs/description/
Example 1:
Given 1->2->3->4, you should return the list as 2->1->4->3.
Note:
- Your algorithm should use only constant extra space.
- You may not modify the values in the list's nodes, only nodes itself may be changed.
算法分析
注意极端情况检查。
提交代码:
class Solution {
public:
ListNode* swapPairs(ListNode* head) {
if (head == nullptr || head->next == nullptr) return head;
ListNode* dummpy = new ListNode(-1);
dummpy->next = head;
for (ListNode* prev = dummpy, *curr = prev->next, *next = curr->next;
next; prev = curr, curr = curr->next, next = curr ? curr->next : nullptr)
{
prev->next = next;
curr->next = next->next;
next->next = curr;
}
return dummpy->next;
}
};
测试代码:
// ====================测试代码====================
void Test(const char* testName, ListNode* head, ListNode* expected)
{
if (testName != nullptr)
printf("%s begins: \n", testName);
Solution s;
ListNode* result = s.swapPairs(head);
while (result && expected)
{
if (result->val != expected->val)
{
printf("failed\n");
return;
}
result = result->next;
expected = expected->next;
}
if(result || expected)
printf("failed\n");
else
printf("passed\n");
}
int main(int argc, char* argv[])
{
ListNode* node1 = new ListNode(1);
ListNode* node2 = new ListNode(2);
ListNode* node3 = new ListNode(3);
ListNode* node4 = new ListNode(4);
ConnectListNodes(node1, node2);
ConnectListNodes(node2, node3);
ConnectListNodes(node3, node4);
ListNode* node5 = new ListNode(2);
ListNode* node6 = new ListNode(1);
ListNode* node7 = new ListNode(4);
ListNode* node8 = new ListNode(3);
ConnectListNodes(node5, node6);
ConnectListNodes(node6, node7);
ConnectListNodes(node7, node8);
Test("Test1", node1, node5);
return 0;
}