题目链接:Swap Nodes in Pairs

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.

这道题的要求是交换链表中相邻的节点。要求:使用恒定空间,不允许修改链表中的数值,仅可以改变链表节点本身。

这道题考察的是链表处理,同样还是现在链表前面加个头,便于统一处理链表的所有节点。

假设链表为:
head -> 1 -> 2 -> 3 -> 4 -> NULL

加头之后为:
h -> 0 -> 1 -> 2 -> 3 -> 4 -> NULL

可先领p指向要交换节点的第一个节点的前一节点,temp指向要交换节点的第一个节点,即:
h -> 0 -> 1 -> 2 -> 3 -> 4 -> NULL
     ^    ^
     |    |
     p   temp

接下来,要使1和2两个节点交换,只需要交换其指针指向即可,即先将p->next指向节点2:
     |-------->|
h -> 0    1 -> 2 -> 3 -> 4 -> NULL
     ^    ^
     |    |
     p   temp

然后temp->next指向节点3:
     |-------->|
h -> 0    1    2 -> 3 -> 4 -> NULL
     ^    |-------->|
     |    ^
     p    |
         temp

最后再使节点2的next指回节点1:
     |-------->|
h -> 0    1 <- 2    3 -> 4 -> NULL
     ^    |-------->|
     |    ^
     p    |
         temp

即:
h -> 0 -> 2 -> 1 -> 3 -> 4 -> NULL
     ^         ^
     |         |
     p        temp

接下来再移动p指针到下一要交换节点对的前面(即temp处)即可:
h -> 0 -> 2 -> 1 -> 3 -> 4 -> NULL
               ^
               |
               p

进而继续交换节点3和节点4,以此类推,进行循环。。。

时间复杂度:O(n)

空间复杂度:O(1)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Solution
{
public:
    ListNode *swapPairs(ListNode *head)
    {
        ListNode *h = new ListNode(0), *p = h;
        h -> next = head;
        
        while(p -> next != NULL && p -> next -> next != NULL)
        {
            ListNode *temp = p -> next;
            p -> next = temp -> next;
            temp -> next = p -> next -> next;
            p -> next -> next = temp;
            p = temp;
        }
        
        return h -> next;
    }
};