两两交换链表中的结点
问题描述:给一个链表,两两交换其中的结点,然后返回交换后的链表。 如给定1->2->3->4->NULL;return 2->1->4->3->NULL.
挑战:你的算法只能使用常数的额外空间,并且不能只是单纯的改变结点内部的值,而是需要实际的进行结点交换。
解题思路: 若给定的链表为空或者只有一个结点,则返回原链表即可;若给定的链表至少有2个结点,则需要申请三个结点空间,不妨设为p,q,dummy,用dummy存放给定链表第一个结点的地址;p的作用是保存所要交换的两结点中的第一个结点,同时为了指针链不断掉,p的next还要指向两结点后的第一个结点;q的作用就是为了两结点顺利交换的中间变量。两两向下遍历,用此方法最终就会实现两两结点互换。
实现代码:
class Solution {
public:
/**
* @param head a ListNode
* @return a ListNode
*/
ListNode* swapPairs(ListNode* head) {
// Write your code here
if(head==NULL) return NULL;
if(head->next==NULL) return head;
ListNode *p=new ListNode(0);
ListNode *q=new ListNode(0);
ListNode *dummy=new ListNode(0);
dummy->next=head;
head=dummy;
while(head->next!=NULL&&head->next->next!=NULL){
p=head->next;
q=head->next->next;
head->next=q; //向下遍历
p->next=q->next; //为了不让链表断开
q->next=p; //改变指针方向
head=p;
}
return dummy->next;
}
};
public:
/**
* @param head a ListNode
* @return a ListNode
*/
ListNode* swapPairs(ListNode* head) {
// Write your code here
if(head==NULL) return NULL;
if(head->next==NULL) return head;
ListNode *p=new ListNode(0);
ListNode *q=new ListNode(0);
ListNode *dummy=new ListNode(0);
dummy->next=head;
head=dummy;
while(head->next!=NULL&&head->next->next!=NULL){
p=head->next;
q=head->next->next;
head->next=q; //向下遍历
p->next=q->next; //为了不让链表断开
q->next=p; //改变指针方向
head=p;
}
return dummy->next;
}
};