zoukankan      html  css  js  c++  java
  • 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;
        }
    };
    
  • 相关阅读:
    offsetheight和clientheight和scrollheight的区别以及offsetwidth和clientwidth和scrollwidth的区别
    响应时间控制
    浏览器兼容
    生成随机数
    递归加载目录
    用委托定义的冒泡排序法
    ref 与out
    二维数组与交错数组的理解
    C#学习
    Jquery选择器
  • 原文地址:https://www.cnblogs.com/baebae996/p/13844768.html
Copyright © 2011-2022 走看看