Given a linked list, swap every two adjacent nodes and return its head.
For example,
Given 1->2->3->4, you should return the list as 2->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.
思路:
利用插入的办法,交换两个节点。维护一个pre节点,表示插入的前一个节点。维护一个cur节点,表示要插入的节点。同时构造一个虚拟头结点dummyhead,维护链表的头结点。
Attention:
1. 如果链表为空,或者只有一个节点,返回链表。
if(head == NULL || head->next == NULL) return head;2. 维护三个节点。
ListNode* dummyhead = new ListNode(0); dummyhead->next = head; ListNode* cur = head; ListNode* pre = dummyhead;3. 注意判断当cur本身指向最后一个节点时,也不进行处理。
while(cur != NULL && cur->next != NULL)复杂度:O(N)
AC Code:
/**
* 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) {
ListNode* dummyhead = new ListNode(0);
dummyhead->next = head;
ListNode* cur = head;
ListNode* pre = dummyhead;
if(head == NULL || head->next == NULL) return head;
while(cur != NULL && cur->next != NULL)
{
cur = cur->next;
ListNode* tmp = cur->next; //保存插入节点的后一个结点
cur->next = pre->next; //将cur节点插入
pre->next = cur;
pre = cur->next; //移动pre到下一个插入位置
cur->next->next = tmp; //连接交换后的节点和插入节点的后一个节点
cur = tmp; //移动cur节点
}
return dummyhead->next;
}
};
[C++]LeetCode: 109 Swap Nodes in Pairs (交换相邻节点位置)
原文:http://blog.csdn.net/cinderella_niu/article/details/42836767