题目:将链表的奇数位和偶数位调换组成新的链表

题目:将链表的奇数位和偶数位调换组成新的链表

原题链接: http://oj.leetcode.com/problems/swap-nodes-in-pairs/

Given a linked list, swap every two adjacent nodes and return its head.
For example,
Given 1->2->3->4, you should return the list as 2->1->4->3.
Your algorithm should use only constant space.
You may not modify the values in the list, only nodes itself can be changed

# 分析

struct ListNode swapPairs(struct ListNode head)

Q1
Given 1->2->3->4, you should return the list as 2->1->4->3
head指向第一个元素 1 函数指针传递是传递 无论如何交换参数head
不可能返回指向元素2 如何解决?

  • 必须重新建立一个新的链表 进行返回
  • 采用 带头节点单链表

    知识补充:带头节点单链表和不带头节点单链表有什么区别

    **
    带头结点单链表好处解决了 不用判断第一个节点是否为空 不需要特殊处理
    用统一方法实现就 例如 链表insert操作

    **
    返回值是最新链表 struct ListNode head 不是*

Q2: 链表遍历操作 ptr(A)=ptr->next(B) 前提条件节点A和节点B 位置关系没有发现变化
在链表排序(交换位置是排序一个方法)原来位置发生改变如何处理 ?

  • 需要临时遍历记录 下 B位置
  • 链表交换节点 影响不是2个 而是三个 不要忘记最后
    1 -2-3 A=2 B=3
    2-1-3 A=2 B=1 >>A=1 B=3

    解题思路如下

第一次循环处理结果:
root: 0 ->1->2->3 ->4 之前 pre=0 cur=1
root: 0 ->2->1->3->4 之后 pre=1 cur=3
pre相对于原来排序移动2次

code

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *    int val;
     ListNode next;
 *    ListNode(int x): val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode swapPairs(ListNode head)
    {
          //head节点
          ListNode root(0);
          root.next =head;

          ListNode * pre=&root;//0
          ListNode * cur =head;//1

         while(cur && cur->next)
         {
           //swap
           pre->next=cur->next;// 0 --> 2
           cur->next=pre->next->next;//1 --> 3
           pre->next->next=cur;//2->1

          pre=cur;// 虽然 pre 仍然指向 位置1 原来位置1 swap之后放到位置2后面
          cur=cur->next;//pre ->1 cur->3 节
         //0 ->2->1->3->4
  }

       return root.next;
    }
};

执行行效率分析:
https://leetcode.com/submissions/detail/102239317/

耗时6ms不是最优解呀
耗时应该在建立头节点
如果不用头节点 需要特殊处理 第一次处理时候null
查看耗时3秒的 提取到函数外面 为了防止异常数据 异常判断

为了完成遍历 采用三个节点 first second three 三个节点

关注微信公共账号

时间: 2024-08-30 04:22:06

题目:将链表的奇数位和偶数位调换组成新的链表的相关文章

flash-求教:利用Flash as3.0编写代码,计算奇数和,偶数和。

问题描述 求教:利用Flash as3.0编写代码,计算奇数和,偶数和. 计算3 – 42352 偶数和及奇数和分别为多少?(涉及求余%) 解决方案 var os = 0; // 奇数和 var es = 0; // 偶数和 for (var i=3; i <=42352; i++) { if (i %2 == 0) es = es + i; else os = os + i; }

身份证号码15位升18位(C#)

  身份证号码15位升18位 身份证18位验证      18位身份证标准在国家质量技术监督局于1999年7月1日实施的GB11643-1999<公民身份号码>中做了明确的规定. GB11643-1999<公民身份号码>为GB11643-1989<社会保障号码>的修订版,其中指出将原标准名称"社会保障号码"更名为"公民身份号码",另外GB11643-1999<公民身份号码>从实施之日起代替GB11643-1989.GB

15位和18位身份证JS校验的简单实例_javascript技巧

一.身份证号码的结构和表示形式 1.号码的结构 根据[中华人民共和国国家标准GB11643-1999]中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成.排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码. 2.地址码 表示编码对象常住户口所在县(市.旗.区)的行政区划代码,按GB/T2260的规定执行. 3.出生日期码 表示编码对象出生的年.月.日,按GB/T7408的规定执行,年.月.日代码之间不用分隔符. 4.顺序

自己写的身份证号码15位升18位的函数

今天在网上找到一个身份证号码15位升18位的算法,就随手自己写了一个函数来实现 Public Function s15to18()Function s15to18(ByVal str15 As String) As String        Dim strtemp As String        strtemp = Replace(str15, str15.Substring(0, 6), str15.Substring(0, 6) & "19")        Dim A

javascript-求一js正则表达式:校验是否是3位字母+3位数字!

问题描述 求一js正则表达式:校验是否是3位字母+3位数字! 小弟的正则表达式不是很清楚,思路迷迷糊糊的. 题目要求: 校验字符串:3位大写字母+3位数字,长度为6;且必须是开头3位为大写字母,后面三位是数字.比如:某航段的编号是:PEK001! 下面是js代码: var regOffice = /^[A-Z]{3}(d){3}{1}/g; 解决方案 /^[A-z]{3}d{3}$/ 解决方案二: [A-Z]{3}d{3} 解决方案三: [A-Z]{3}d{3} 解决方案四: 经过实验,得到最后

js身份证判断方法支持15位和18位

 这篇文章主要介绍了js身份证判断方法支持15位和18位,需要的朋友可以参考下 代码如下: //HTML页面上要有一个id为identity_card的input输入框,一个id为ipmessage的身份证错误或正确时提示消息的地方  <script>  //身份证验证  $(document).ready(function(){  $("#identity_card").change(function(){  var idcard =$(this).val();  che

在双硬盘上安装独立32位和64位双系统

现在的64位操作系统还没有中文版,加之受兼容性问题的影响,组建独立多系统显然已成为最佳的解决方案.很多朋友在配置64位硬件平台时已购入了SATA硬盘,但同时拥有SATA和PATA硬盘的朋友也不在少数,下面就来说明怎样在这两块硬盘上构建32位和64位Windows XP的独立双系统. 一.设置SATA硬盘 说明:本次用于试验的硬盘为: PATA接口的希捷40GB和SATA接口的希捷80GB硬盘各一块.怎样设置SATA硬盘,由主板决定,本文以硕泰克SL-K8AV2-R1L主板上的设置方法为例.各位朋

如何看linux是32位还是64位

查看linux机器是32位还是64位的方法: 方法一:file /sbin/init    或者   file /bin/ls 结果如下:/sbin/init: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, stripped 如果显示 64-bit 则为64位:file /sbin/init/sbin/init: E

单链表的顺序-c++正序与逆序创建单链表有什么区别

问题描述 c++正序与逆序创建单链表有什么区别 c++正序与逆序创建单链表有什么本质的区别,逆序比顺序的优点体现在哪? 解决方案 逆序没什么特别的好处,给你学编程的时候练练手玩的,在实际的项目中会用到标准库,那是双向链表,没有逆序创建一说. 要说逆序的好处:当要加入新的数据时,不需要遍历链表,可以直接在头结点之后插入即可,减少时间复杂度 解决方案二: 没有太大价值吧......不过双向的链表应用很广泛 解决方案三: 逆序创建单链表