题目说只能使用常量级别空间,那么可以交换节点的值即可,但是交换用异或运算来做。然而题目还有一个要求,就是不能修改列表中的值。所以还是乖乖修改节点指针域吧。
思路:比如1 -> 2 -> 3->4
修改后的结果是2 -> 1 -> 4->3.可以这样做。设定两个指针分别指向待修改链表的头部和第头部的下一个元素。
比如上面的2 1 ,首先修改1指向的节点,指向2,然后2指向的next就是4和3这两个调换之后的头节点了,对4 和 3做同样的操作得到剩余链表的头结点,就是递归了。
class Solution {
public:
ListNode *swapPairs(ListNode *head) {
if(head == nullptr)
return nullptr;
ListNode * pre = head;
ListNode * beh = head -> next;
if(beh == nullptr)//只有头结点,直接返回头节点即可
return pre;
ListNode * nhead = beh;//最终结果的链表的头部就是头部的下一个元素
ListNode * temp = beh->next;//暂时储存待交换链表的头部。
beh->next = pre;//修改指针域指向头节点。
pre->next = swapPairs(temp);//头节点的next指针域就是待操作的 剩余链表的头结点了
return nhead;//返回头结点
}
};