解答:
方法一:头结点+直接两两交换每一对相邻结点
关键点:处理好相邻结点交换过程中的”指针变换次序“
ListNode* swapPairs(ListNode* head) {
if(!head) return nullptr;
ListNode dummy(0);
dummy.next = head;
ListNode* pre = &dummy;
ListNode* cur = head;
while(cur && cur->next)//待交换的一对元素
{
pre->next = cur->next;
pre = pre->next;
cur->next = pre->next;
pre->next = cur;
pre = cur;
cur = cur->next;
}
return dummy.next;
}
4ms;-2%
方法二:递归—交换head与last即为一对
ListNode* swapPairs(ListNode* head) {
if(head == nullptr) return nullptr;
if(head->next == nullptr) return head;
ListNode* last = head->next;
head->next = swapPairs(last->next);
last->next = head;
return last;
}
4ms;-2%
方法三:指针的指针
ListNode* swapPairs(ListNode* head) {
ListNode **pp = &head,*a,*b;
while((a = *pp) && (b = a->next))//这里的循环判断设置得非常巧妙
{
a->next = b->next;
b->next = a;
*pp = b;
pp = &(a->next);
}
return head;
}
方法四:第一次自己的思路-分别保存奇数序号和偶数序号的链表,然后将奇数序号链表中的元素插入到偶数序号链表的元素中——超时
ListNode* swapPairs(ListNode* head) {
if(head == nullptr) return nullptr;
if(head->next == nullptr) return head;
ListNode dummy(0);
dummy.next = head;
ListNode* odd = head;
ListNode* oddLast = head;
ListNode* even = &dummy;
ListNode* evenLast = &dummy;
//拆分成两个链表
while(odd && odd->next)
{
//偶数序号
evenLast = even;
even = even->next->next;
evenLast->next = even;
//奇数序号
oddLast = odd;
odd = odd->next->next;
oddLast->next = odd;
}
cout<< dummy.next->val <<endl;
//拼接
odd = head;
oddLast = head->next;
even = &dummy;
evenLast = dummy.next;
//插入
while(oddLast && evenLast)
{
even = evenLast;
evenLast = evenLast->next;
//
even->next = odd;
odd->next = evenLast;
//
odd = oddLast;
oddLast = oddLast->next;
}
if(oddLast==nullptr && evenLast==nullptr) {even->next->next = odd;}
if (oddLast==nullptr && evenLast!=nullptr) {evenLast->next = odd;}
return dummy.next;
}
总结:
1.本题主要考察的是结点交换过程中指针的操作问题
网友评论