本周題目難度"Medium",碎片化的時間加起來,我大概用了三個小時吧,還是看財(cái)務(wù)學(xué)習(xí)視頻的時候突然有了想法(學(xué)習(xí)的效率多低,唉。。。)
題目:給你一個單鏈表,要求你將鏈表相臨的兩個節(jié)點(diǎn)交換后返回。即第一個節(jié)點(diǎn)和第二個節(jié)點(diǎn)交換,第三個節(jié)點(diǎn)和第四個節(jié)點(diǎn)交換。。。要是最后剩了一個奇數(shù)節(jié)點(diǎn)就不用換了
思路:這題還需要思路么?就兩兩交換,小學(xué)生都會,只是代碼實(shí)現(xiàn)就比較糾結(jié)了,所以直接來看代碼吧(效率一般):
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* swapPairs(struct ListNode* head) {
//如果給的是空鏈,直接返回
if (head == NULL) return head;
//若是單節(jié)點(diǎn)鏈表,也直接返回
if (head->next == NULL) return head;
//將第二個節(jié)點(diǎn)作為新頭部
struct ListNode* newHead = head->next;
struct ListNode* result = newHead;
//將原頭節(jié)點(diǎn)的下一個節(jié)點(diǎn)指向原第三個節(jié)點(diǎn)
head->next = head->next->next;
//將新節(jié)點(diǎn)的第二個節(jié)點(diǎn)置為原頭節(jié)點(diǎn),至此,頭節(jié)點(diǎn)和第二個節(jié)點(diǎn)就交換完成了
result->next = head;
//移動到第二個節(jié)點(diǎn)處
result = result->next;
//如果第三個節(jié)點(diǎn)不為空(為了方便注釋,我就按第一次執(zhí)行來說)
while(result->next != NULL) {
//如果第四個節(jié)點(diǎn)不為空
if (result->next->next != NULL) {
//記錄第三個節(jié)點(diǎn)
struct ListNode* temp1 = result->next;
//將第四個節(jié)點(diǎn)置為新的第三個節(jié)點(diǎn)
result->next = result->next->next;
//移到下一個節(jié)點(diǎn)
result = result->next;
//記錄第五個節(jié)點(diǎn)(是NULL也無所謂)
struct ListNode* temp2 = result->next;
//將第四個節(jié)點(diǎn)置為原第三個節(jié)點(diǎn)
result->next = temp1;
//移到下一個節(jié)點(diǎn)
result = result->next;
//拼接第五個節(jié)點(diǎn),至此,第三個和第四個節(jié)點(diǎn)交換完成
result->next = temp2;
//如果沒有第四個節(jié)點(diǎn)(最后一個是奇數(shù)節(jié)點(diǎn)),直接返回
}else return newHead;
}
return newHead;
}
方法有很多,我寫的還是比較low的,小伙伴可以開動大腦,多寫幾種。