Given a linked list, swap every two adjacent nodes and return its head.
For example,
Given 1->2->3->4
, you should return the list as 2->1->4->3
.
Your algorithm should use only constant space. You may not modify the values in the list, only nodes itself can be changed.
这里贴一个错误代码,本人的:
/** * 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) { // IMPORTANT: Please reset any member data you declared, as // the same Solution instance will be reused for each test case. if(head|| head->next) return head; ListNode *p, *q, *swap; p = head; q = p->next; swap = q; while(p&&q) { p->next = q->next; q->next = p; p = p->next; q = p->next; } return swap; } };
Submission Result: Runtime Error
Last executed input:{1,2}原因:
q = p->next; //此时p=NULL了
于是添加 if(p)于前
又错误:
Submission Result: Runtime Error
Last executed input:{}还是那个原因
if(head||head->next)
head=NULL时, head->next就错了
改之:
if(!head||!head->next) return head;
当一切就绪时,
/** * 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) { // IMPORTANT: Please reset any member data you declared, as // the same Solution instance will be reused for each test case. if(!head||!head->next) return head; ListNode *p, *q, *swap; p = head; q = p->next; swap = q; while(p&&q) { p->next = q->next; q->next = p; p = p->next; if(!p) break; else q = p->next; } return swap; } };
Input:{1,2,3,4}Output:{2,1,3}Expected:{2,1,4,3}
这个错误是, 到后面, 前断开的没连上
增加前面的pre
最终代码:
/** * 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) { // IMPORTANT: Please reset any member data you declared, as // the same Solution instance will be reused for each test case. if(!head||!head->next) return head; ListNode *p, *q, *swap, *pre; p = head; q = p->next; swap = q; pre = NULL; while(p&&q) { p->next = q->next; q->next = p; if(pre) pre->next = q; pre = p; p = p->next; if(!p) break; else q = p->next; } return swap; } };