力扣 题目24-- 两两交换链表中的节点
题目
题解
递归法:
先考虑交互的代码 即
list1->next = list2->next;
list2->next = list1;
再考虑 如果采用递归的话 每次返回什么?
可以看出 返回的肯定是 本次交换之后第一个节点 然后在上一次递归时用交换之后第二个节点->next 接收 这样就能把所有的节点串起来即
ListNode* exchangeTwoLists(ListNode* list1, ListNode* list2) { list1->next = exchangeTwoLists(list2->next, list2->next->next); list2->next = list1; return list2; }
最后再考虑一下 终止条件即 传过来的链表list2->next如果nullptr或者list2->next->next 为nullptr 则此次交换后不应该继续递归所以我们把交换改成正常的即可
ListNode* exchangeTwoLists(ListNode* list1, ListNode* list2) { if (list2->next == nullptr||list2->next->next == nullptr) { list1->next = list2->next; list2->next = list1; return list2; } list1->next = exchangeTwoLists(list2->next, list2->next->next); list2->next = list1; return list2; }
代码
1 #include<iostream> 2 #include<vector> 3 using namespace std; 4 struct ListNode { 5 int val; 6 ListNode* next; 7 ListNode() : val(0), next(nullptr) {} 8 ListNode(int x) : val(x), next(nullptr) {} 9 ListNode(int x, ListNode* next) : val(x), next(next) {} 10 }; 11 ListNode* exchangeTwoLists(ListNode* list1, ListNode* list2) { 12 if (list2->next == nullptr||list2->next->next == nullptr) { 13 list1->next = list2->next; 14 list2->next = list1; 15 return list2; 16 } 17 list1->next = exchangeTwoLists(list2->next, list2->next->next); 18 list2->next = list1; 19 return list2; 20 } 21 class Solution { 22 public: 23 ListNode* swapPairs(ListNode* head) { 24 //判断一下初始 如果为空和长度为1 就直接返回 25 if (head== nullptr||head->next == nullptr) { 26 return head; 27 } 28 ListNode* list=exchangeTwoLists(head, head->next); 29 return list; 30 } 31 }; 32 void listnum(ListNode& list, vector<int>& vectorlist) { 33 ListNode* headlist = &list; 34 for (int i = 0; i < vectorlist.size(); i++) { 35 ListNode* p; 36 p = (struct ListNode*)malloc(sizeof(struct ListNode*)); 37 p->val = vectorlist[i]; 38 headlist->next = p; 39 headlist = headlist->next; 40 } 41 headlist->next = NULL; 42 } 43 int main() { 44 Solution sol; 45 ListNode list1(1); 46 vector<int> vectorlist1 = {2,3,4,5,6}; 47 listnum(list1, vectorlist1); 48 ListNode* list=sol.swapPairs(&list1); 49 for (int i = 0; list != NULL; i++) { 50 cout << list->val << endl; 51 list = list->next; 52 } 53 }