力扣 题目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 }
View Code

 

 

 

posted @ 2022-04-12 14:21  无聊的阿库娅  阅读(24)  评论(0编辑  收藏  举报