力扣刷题记录9.1-----24. 两两交换链表中的节点


完成次数 2

一、题目

在这里插入图片描述

二、代码

/**
 * 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)
    {
     
    // //统一链表格式
    // ListNode* dummyhead = new ListNode(0);  //设置虚假的头结点 为了使得单节点和多节点情况统一 
    // dummyhead->next = head;

    ListNode* test_node = new ListNode(0);    //探测节点 查看之后是否还有两个以上节点
    test_node=head;

    if(test_node==nullptr) return test_node;   //空节点直接返回
    else if(test_node->next==nullptr) return test_node;  //单个节点直接返回
    else                                       //大于两个节点 开始操作   比如 2 1 null 
    {

    ListNode* return_node = new ListNode(0); 
    return_node=head->next;

    ListNode* temp_node = new ListNode(0);      //两大类情况 如果链表内没有节点或者只有一个节点 那么应该直接返回    ***最核心部分 哨兵探测
    ListNode* quick_node = new ListNode(0); 
    ListNode* slow_node = new ListNode(0); 
    


    temp_node=head->next->next;
    quick_node=head->next;
    slow_node=head;

    int one_opeation=0;

    while(test_node!=nullptr&&test_node->next!=nullptr)
    {
        std::cout<<" 进入  "<<std::endl;
        // //用于显示当前节点值
        // std::cout<<"slow_node->val   "<<slow_node->val <<std::endl;
        // std::cout<<"quick_node->val   "<<quick_node->val <<std::endl;
        // std::cout<<"temp_node->val   "<<temp_node->val <<std::endl;

        test_node=test_node->next->next;  // 每一轮探测指针单独操作

    

       if(one_opeation==1)
       {
       slow_node=temp_node;
       quick_node=slow_node->next;
       temp_node=quick_node->next;
       }

        if(one_opeation==0) one_opeation=1;   //第一轮不需要

       quick_node->next=slow_node;

       //temp_node往下移动会有三种情况  nullprt  一个值 两个值
       if(temp_node==nullptr)         slow_node->next=temp_node;
       else if (temp_node!=nullptr&&temp_node->next==nullptr)   slow_node->next=temp_node;
       else if(temp_node!=nullptr&&temp_node->next!=nullptr)    slow_node->next=temp_node->next;
 
       

            // //用于显示当前链表
            //     ListNode *show_node;
            //     show_node=return_node;  //构造处理节点
            //     while(show_node->next!=nullptr)
            //     {
            //         std::cout<<"  "<<show_node->val<<"   ";
            //         show_node=show_node->next;
            //     }
            //     std::cout<<"  "<<show_node->val<<"   ";  //打印最后一个
            //     std::cout<<"  "<< std::endl;

        //    //用于显示当前节点值
        //    std::cout<<"slow_node->val   "<<slow_node->val <<std::endl;
        //    std::cout<<"quick_node->val   "<<quick_node->val <<std::endl;
        //     std::cout<<"temp_node->val   "<<temp_node->val <<std::endl;

      std::cout<<" 离开  "<<std::endl;
    }
    return return_node;
    }

    }
};

三、运行结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@白圭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值