• LeetCode(24):两两交换链表中的节点


    题目描述

    给定一个链表,两两交换其中相邻的节点,并返回交换后的链表
    注:不能单纯改变节点内部的值,而是需要实际的进行节点交换
    image.png
    示例:

    输入:1->2->3->4->8
    输出:2->1->4->3->8

    三指针法

    在正式开始交换之前,先排除链表为空或者链表只有1个节点的情况(节省空间)

    定义一个先头节点p,让它的next指向head
    初始化指针pre指向p
    设定标志位isHead(用于更新head)

    在每一轮循环中:
    1、初始化
    初始化临时指针a为 pre->next
    初始化临时指针b为 a->next
    (从左到右分别是 pre、a、b,a和b指向将要交换的节点)
    2、交换
    操作a、b、pre指针
    3、判断是否需要更新head
    4、更新pre

    当pre->next或者(pre->next)->next为空时,表示交换工作结束
    代码如下:

    /**
     * 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) {
            if(head==NULL || head->next==NULL){
                return head;
            }
            ListNode p(0,head);
            bool isHead = true;
            ListNode *pre=&p;
    
            while(pre->next!=NULL && (pre->next)->next!=NULL){
                ListNode *a=pre->next;
                ListNode *b=a->next;
    
                a->next=b->next;
                b->next=a;
                pre->next=b;
    
                if(isHead==true){
                    head=b;
                    isHead=false;
                }
    
                pre=a;
            }
            return head;
        }
    };
    
  • 相关阅读:
    tcl中指定随机数种子
    redis的三种连接方式
    js代码统计table中某一列的值
    CRF从HMM的演进
    SVM中的一些问题
    bert损失函数
    SQL 注入笔记
    20200818 千锤百炼软工人第四十四天
    20200816 千锤百炼软工人第四十三天
    20200816 千锤百炼软工人第四十二天
  • 原文地址:https://www.cnblogs.com/baebae996/p/13844768.html
Copyright © 2020-2023  润新知