题目
解法:哨兵节点迭代
在链表之前加上一个哨兵节点,这样对链表的头节点的操作就统一了起来,然后可以用双指针,当然用三个指针也可以,我第一次想的就是三个指针,但是觉得三个指针加上哨兵节点太多了,而且节点数是两个的时候第三个指针就是空的,就换了双指针。
第一次以为只有偶数个节点,因为示例里只有偶数个,写了之后报错,因为可以有奇数个节点,然后看了返回值,在循环加个判断条件head->next!=NULL就可以了。
/**
* 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==NULL||head->next==NULL)return head;
ListNode *prehead=new ListNode(-1);
prehead->next=head;
//增加一个哨兵节点
ListNode *pre=prehead;
//prehead作为返回值,pre指针进行操作
while(head&&head->next)
//head->next是当节点数为奇数时,head走到末尾便停止
//偶数个节点是head走到末尾的后一个。
{
//交换节点值
pre->next=head->next;
head->next=pre->next->next;
pre->next->next=head;
//移动前驱节点的指针
pre=pre->next->next;
head=pre->next;
}
//返回哨兵节点的后一个节点。
return prehead->next;
}
};