题目描述:给链表,交换每相邻的两个元素。如:
Given 1->2->3->4, you should return the list as 2->1->4->3.
要求空间复杂度为O(1),不能修改结点的值,只能改结点本身。
分析:设立三个连续指针,后两个指向待交换交换结点,前一个用于保持前部分的连接。画图分析即可弄清指针处理次序。时间复杂度O(n),空间O(1)。
代码:
/**
* 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 ||head->next == nullptr)
return head;
ListNode l(-1);
l.next = head;
for (ListNode *pre = &l, *cur = pre->next, *nx = cur->next;
nx;
pre = cur, cur = cur->next, nx = cur? cur->next : nullptr) //三个指针重新回到相对次序,保证每次循环前情况一致
{ //交换处理
pre->next = nx;
cur->next = nx->next;
nx->next = cur;
}
return l.next;
}
};
网友评论