【ACM】【链表】关于在链表中实现…

原创 2013年12月03日 11:12:42

设计思想:

相对于数据结构为数组的插入排序方法,现在要解决的是如何实现链表中的插入排序。数组的存储方式是顺序存储,而链表的存储方式是链式存储。所以,要实现针对链表的插入排序法,其关键是解决如何能够保证链表不发生断链的情况。

首先,我们先考虑在链表中只有两个结点——也就是只有头结点和尾结点的情况:

令 p1 指向头结点, p2 指向尾结点

【ACM】【链表】关于在链表中实现插入法排序

如果 p1 指向的结点与 p2 指向的结点已经是有序(此处指的是按设计人员的设计升序或者降序排列)的,那么,则不作任何操作,排序完成。否则,则应对相对的指针进行操作,令链表变成有序的。

此时:

令 head 等于 p2

令 p2->next 等于 p1

令 p1->next 等于 NULL

【ACM】【链表】关于在链表中实现插入法排序

下面来考虑多于两个结点的实现方式

假设现在有一个六个结点的链表,其中 p1 、 p2 所指向的节点分别为头结点以及第二个结点,而且已经是有序排列。此时,定义两个指针 p3 、 p4 用于查找结点,其中 p4 为查找用指针, p3 为 p4 的前驱,用于插入结点时连接链表用。再设置两个指针 p5 、 p6 指向 p2 的下一个结点。

现分析一下其中的作用:

p1 与 p2 用于确定头结点与尾结点的位置

p3 与 p4 用于查找有序链表中应该插入的位置

p5 用于指向所要插入结点的地址,确定 p5 插入后 p6 用于指向下一个结点以保证链表仍然能够正确的连接上。

【ACM】【链表】关于在链表中实现插入法排序

这时候有三种情况:

如果 p5 所指向的结点应该作为头结点

令 p6 指向下一个结点

【ACM】【链表】关于在链表中实现插入法排序

p5 指向 p1 , head 指向 p5

【ACM】【链表】关于在链表中实现插入法排序

再令 p1 等于 p5 , p2->next=p6

【ACM】【链表】关于在链表中实现插入法排序

此时,可以发现,在链表中其中一个结点已经进行了插入法排序,此时链表中有序的结点增加到 3 个。此时,再令 p1 等于头结点, p5 等于 p6 , p3 等于 p1 , p4 等于 p1->next 。

【ACM】【链表】关于在链表中实现插入法排序

如果 p5 应该插入到链表中间。

那么,应该确定 p5 所指向结点要插入的位置,再令 p6 指向下一个结点

【ACM】【链表】关于在链表中实现插入法排序

接着令 p5->next=p4 , p3-next=p5 实现插入。

【ACM】【链表】关于在链表中实现插入法排序

最后,令 p2->next=p6 ,重新实现链表的连接。

【ACM】【链表】关于在链表中实现插入法排序

再令 p5=p6 ,进行下一个结点的排序。

最后,当结点要作为已排序的链表的最后一个结点时,直接令 p2=p5 即可。

依次将各个结点利用插入法加入到链表中,直到 p2->next=p6=NULL 为止。

ACM-杭电 HDOJ-1216 模拟,链表

用下面的方法模拟,最开始开50000的链表跑了187ms,真是相当的惭愧呀。后改用35000的链表跑了109ms。最后改用c的输入输出(也就是下面放出的代码)跑了78ms,其实自己写链表会跑的更快。不...
  • lancegentry
  • lancegentry
  • 2012年09月24日 00:25
  • 2419

ACM学习历程16——List链表的应用之简单约瑟夫问题

约瑟夫问题是list链表的应用之一,问题描述:N个人围成一个圆圈,每个人都有唯一的一个编号,编号从1到N,从编号为1的人开始报数,依次报到K,报数为K的人出列,他的下一个又从1开始报数,直到所有的人都...
  • u010480899
  • u010480899
  • 2016年08月25日 21:42
  • 982

java 发布jar包的问题

Manifest-Version: 1.0 Class-Path: lib\Oracle.jar  lib\log4j.jar Main-Class: FileConvey   当关联其他...
  • liuxinxin1125
  • liuxinxin1125
  • 2011年11月08日 14:22
  • 237

【ACM】【链表】关于在链表中实现…

设计思想: 相对于数据结构为数组的插入排序方法,现在要解决的是如何实现链表中的插入排序。数组的存储方式是顺序存储,而链表的存储方式是链式存储。所以,要实现针对链表的插入排序法,其关键是解决如何能够保...
  • nono_thin
  • nono_thin
  • 2013年12月03日 11:12
  • 940

C++实现单链表的创建和打印

链接存储方法  链接方式存储的线性表简称为链表(Linked List)。  链表的具体存储表示为:   ① 用一组任意的存储单元来存放线性表的结点(这组存储单元既可以是连续的,也可以...
  • rl529014
  • rl529014
  • 2016年04月16日 21:23
  • 2175

Unity 用C#写的链表类

Unity 用C#写的链表类 用于保存坐标点 using UnityEngine; using System; using System.Collections; /// ///...
  • xgx198831
  • xgx198831
  • 2012年06月12日 10:02
  • 3537

对块状链表的一点研究ACM NOIP

  • 2009年06月22日 21:04
  • 375KB
  • 下载

Java sdut acm 2178 链表的有序集合

题目链接:点击打开链接 链表的有序集合 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem ...
  • Annfan123
  • Annfan123
  • 2017年04月14日 19:52
  • 357

lua链表的简单实现

lua 实现链表 是比较容易实现的, 但是遇到一个问题,导致判断条件一直出错。遇到的问题分析:list = {}list = nil 两者是不同的。可以做个简单的判断: 1、list = {} if ...
  • jphaoren
  • jphaoren
  • 2010年08月22日 18:25
  • 4558
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【ACM】【链表】关于在链表中实现…
举报原因:
原因补充:

(最多只允许输入30个字)