24.兩兩交換連結串列中的結點
阿新 • • 發佈:2020-08-11
給定一個連結串列,兩兩交換其中相鄰的節點,並返回交換後的連結串列。
你不能只是單純的改變節點內部的值,而是需要實際的進行節點交換。
示例:
給定 1->2->3->4, 你應該返回 2->1->4->3.
遞迴
這個問題存在子問題。去掉頭兩個結點之後仍然是相同的一類問題,因此可以交換頭兩個結點,剩餘結點遞迴處理。
ListNode* swapPairs(ListNode* head) { if(!head||!head->next) return head; ListNode*temp=head->next; head->next=swapPairs(head->next->next); temp->next=head; return temp; }
迭代
常規做法,遍歷結點。連結串列中交換結點需要同時顧前和顧後,需要有一個pre指標指向兩結點之前的一個結點。
模型:pre->l1->l2->rest (l1,l2為待交換的兩個結點)
ListNode* swapPairs(ListNode* head) { if(!head||!head->next) return head; ListNode*l1=head,*l2=head->next,*dummy=new ListNode(-1),*pre=dummy; while(l1&&l1->next){ l2=l1->next; //交換結點 l1->next=l2->next; l2->next=l1; pre->next=l2; //更新結點 pre=l1; l1=l1->next; } return dummy->next; }
leetcode連結:https://leetcode-cn.com/problems/swap-nodes-in-pairs