两两交换链表中的结点(c++)

  1. 题目:
    给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。

你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
2. 解题思路:
解这个题的过程还算波折,我之前准备就用基本的一趟遍历的方法来写这个题,后来因为要用的指针太多了我自己都搞混了,所以选择了一种比较容易理解的方法。
因为是要交换相邻的值,所以我想的是进行一次遍历,按顺序把链表拆分成两个链表,再按照与拆分时候相反的顺序来进行组合,这样来实现相邻的交换。
3. 解题代码:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
    
    
public:
    ListNode* swapPairs(ListNode* head) {
    
    
        //使用两个链表对head进行存储,然后再合并的时候对插入的顺序进行改变
        ListNode * l1 = new ListNode(0);
        ListNode * l2 = new ListNode(0);
        ListNode *p = l1;
        ListNode *q = l2;
        //对head进行分解
        while(head!=nullptr){
    
    
            p->next = head;
            head = head->next;
            p = p->next;
            p->next = nullptr;
            if(head!=nullptr){
    
    
                q -> next = head;
                head = head->next;
                q = q->next;
                q->next = nullptr;
            }
        }
        //对head进行合并
        p = l1->next;
        q = l2->next;
        //给head加一个头结点便于后面的操作
        head = new ListNode(0);
        ListNode *r = head;
        while(p!=nullptr || q!= nullptr){
    
    
           if(q!=nullptr){
    
    
            r->next = q;
            q = q->next;
            r = r->next;
           }
           if(p != nullptr){
    
    
            r->next = p;
            p = p->next;
            r = r->next;
           }
        }
        return head->next;
    }
};

猜你喜欢

转载自blog.csdn.net/qq_43964318/article/details/120491116
今日推荐