24. 两两交换链表中的节点
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
示例:
给定 1->2->3->4, 你应该返回 2->1->4->3.
递归方式
交换p 和 p.next 结点
swapHead = p.next
swapHead.next = p
class Solution {
public:
ListNode* swapPairs(ListNode* head) {
if(head==NULL||head->next==NULL)return head;
ListNode *temp=head->next;
head->next=swapPairs(temp->next);
temp->next=head;
return temp;
}
我之前用的循环方式,不知道为啥总是错的,至今也没有想明白,但是这个要考虑的小细节太多了
// ListNode *p=head;
// ListNode *q=head->next;
// ListNode *root=new ListNode(0);
// ListNode *r=root;
// ListNode *mp=p,*mq=q;
// root->next=q;
// while(p->next->next!=NULL&&q->next->next!=NULL){
// mp=p;mq=q;
// p=p->next->next;
// q=q->next->next;
// r->next=mq;
// mq->next=mp;
// mp->next=p;
// r=r->next->next;
// }
// if(p->next->next==NULL&&q->next==NULL)
// {
// r->next=q;
// q->next=p;
// }
// else if(p->next->next!=NULL&&q->next->next==NULL){
// mp=p;mq=q;
// r->next=mq;
// mq->next=mp;
// mp->next=q->next;
// }
// return root->next;
// }
正确的循环方式:
加上头结点,利用头结点进行交换
public class Solution {
/**
* @param head a ListNode
* @return a ListNode
*/
public ListNode swapPairs(ListNode head) {
ListNode dummy = new ListNode(0);
dummy.next = head;
head = dummy;
while (head.next != null && head.next.next != null) {
ListNode n1 = head.next, n2 = head.next.next;
// head->n1->n2->...
// => head->n2->n1->...
head.next = n2;
n1.next = n2.next;
n2.next = n1;
// move to next pair
head = n1;
}
return dummy.next;
}
}