链表--有序链表&无序链表

一、无序链表

书中的链表,是由两个类组成的,一个是节点类,一个是链表类。

  • 节点类:节点类又包含初始化, 获得data和next,更改data和next的方法。(一般在编程题中, 只会给初始化,包含data和next属性)
    其中,getNext()就是获得下一个节点,比如
    current = current.getNext()
    的意思,就是current此时被赋值为当前节点的下一个节点
class Node:
    def __init__(self,initdata):
        self.data = initdata
        self.next = None

    def getData(self):
        return self.data

    def getNext(self):
        return self.next

    def setData(self,newdata):
        self.data = newdata

    def setNext(self,newnext):
        self.next = newnext
  • 列表类:列表类初始化头结点为none,对应的也有几种常用的方法。isEmpty,add,search,size等。

1.1、链表方法---添加节点add

添加节点方法。其中temp是node类的实例。因为无序链表最容易增加新节点的地方是在头部,或者说在了列表的开始。于是我们把新节点作为列表的第一个节点,就可以构建一个链表了。

def add(self,item):
    temp = Node(item)
    temp.setNext(self.head)
    self.head = temp

在add方法中,temp是从节点类Node中得到的一个实例,这个实例有两个属性,一个是data,一个是next。
第二行,类初始化时把temp的data设置为item,next为None。
第三行,实例方法把节点temp的next指向了旧链表的head。
第四行,把链表mylist的头结点设置为当前节点temp。

在下图中可以看到这个步骤,

  • 本来原链表head是节点93(虚线)
  • 新建立一个节点
    节点data为26,next指向None(虚线)
  • 设置新节点temp的next指向head,也就是节点93。
  • 把新节点temp赋值给head。
  • 完成一次添加节点的操作。

################################################################

链表方法--求元素个数(size),查找(search),移除(remove)
这些方法,都是基于一个叫做链表的遍历的操作,

访问完一个节点,将外部引用移动到下一个节点的操作可以简单理解为:

current = current.getNext()
即,将current 赋值为下一个 节点。直到current为None为止。
################################################################

1.2、size方法

  • 建立外部引用,让current为链表头结点,并设置count为0
  • 只要current不为None,就把count加1,然后让当前节点current指向下一节点(循环此步,知道current为None,即不再有节点为止)
def size(self):
    current = self.head
    count = 0
    while current != None:
        count = count + 1
        current = current.getNext()

    return count

1.3、search方法

  • 建立一个外部引用current,并设置一个变量found初始化为False
  • 只要current不为None并且没有找到target(即found==False),就先进行data比对,然后用current = current.getNext()来获得下一个节点。直到循环结束。
def search(self,item):
    current = self.head
    found = False
    while current != None and not found:
        if current.getData() == item:
            found = True
        else:
            current = current.getNext()

    return found

1.4、remove方法

移除一个节点分两步:

  • 1、查找数据,找到要remove的节点
  • 2、是移除节点,并将链表再次链接起来

上述步骤涉及到对节点的操作,需要引入两个外部引用。current和previous。
current代表要被移除的节点,移除以后,将previous节点的next指向下一个节点即可。

previous初始化为None,所以涉及到previous的操作时,要考虑两种情况:1、previous仍然是None ----2、previous是一般的节点

在此处代码中,也就是,当第一步完成found=True时,要对previous进行判断,根据情况更改指针。

此处我们假设,一定能找到要删除的节点,因此只用bool来控制循环就行了。

def remove(self,item):
    current = self.head
    previous = None
    found = False
    while not found:
        if current.getData() == item:
            found = True
            #当找到需要移除的节点时,才进行移除操作
            if previous == None:
                self.head = current.getNext()
            else:
                previous.setNext(current.getNext())
        else:
            previous = current
            current = current.getNext()

二、有序链表

相对于无序链表,有序链表仍然有add,remove,search等类方法。
在实现上,size,remove的方法操作是一样的,但是因为有序,add,search的方法就要有些许改变了。

同样,此时我们有两个类,一个节点类Node,跟上面的一样,一个有序链表类

class OrderedList:
    def __init__(self):
        self.head = None

2.1 、search方法

因为有序,所以我们不需要一下搜索到底了,因此,当我们搜索到一个节点发现data比target要大时,还没有搜索到target,那我们就可以结束搜索了。所以,相对于无序链表的search方法, 我们额外加了一个stop变量,来控制循环。

  • 找到了target,就把found变为True。
  • 发现了一个data比target大,没找到target,把stop变为True
  • 没找到target,data比target小,就接着向右搜索
def search(self,item):
    current = self.head
    found = False
    stop = False
    while current != None and not found and not stop:
        if current.getData() == item:
            found = True
        else:
            if current.getData() > item:
                stop = True
            else:
                current = current.getNext()

    return found

2.2 、add方法

不同于无序链表,只需要在头部添加新节点就行了。要考虑添加节点以后链表仍是有序的。
分为两步

  • 第一步,找到需要添加节点的位置。
    为此也增加一个控制循环的变量stop。找到新节点位置的两种情况:
    1、当找到data大于target的节点时,stop变为True,此时执行添加节点的操作。
    2、当循环遍历完整个链表是,停止循环,添加节点。

  • 第二步,根据位置,添加节点。
    又因为在链表内部进行增加节点的操作,所以也需要两个外部引用变量previous和current。
    另外,previous同样需要有两种情况需要考虑。

def add(self,item):
    #设置外部引用, 用于节点操作
    current = self.head
    previous = None
    #设置stop变量用于控制循环
    stop = False
    while current != None and not stop:
        if current.getData() > item:
            stop = True
        else:
            previous = current
            current = current.getNext()
    #循环结束,第一步完成,找到了需要添加节点的位置
    #第二步,添加节点,位置不同,操作也不同,分为头结点,中间节点
    temp = Node(item)
    if previous == None:
        temp.setNext(self.head)
        self.head = temp
    else:
        temp.setNext(current)
        previous.setNext(temp)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,639评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,093评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,079评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,329评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,343评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,047评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,645评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,565评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,095评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,201评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,338评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,014评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,701评论 3 332
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,194评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,320评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,685评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,345评论 2 358

推荐阅读更多精彩内容

  • 前言 其实链表的心法就是“指针的操作” 单链表 单链表的结点包括:data(数据)、next指针next指针就是指...
    Corbin___阅读 540评论 0 0
  • //leetcode中还有花样链表题,这里几个例子,冰山一角 求单链表中结点的个数----时间复杂度O(n)这是最...
    暗黑破坏球嘿哈阅读 1,521评论 0 6
  • 作为一个资深的新手程序员😂,链表这些既基础又深奥的东西是日常工作中并不常见,但是却非常重要,所以就总结一下链表的简...
    Clark_new阅读 4,254评论 4 12
  • 喜欢“印蒂瑞拉”这个名字,那是父母对孩子爱的一份表达…… 玛利亚家族创造了“禅绕画”,还能得到官方的...
    观心客阅读 1,173评论 0 0
  • 今天,鹿小迪原本计划着跟朋友们一起去吃饭,可是国王陛下突然紧急召见她,没办法,只得取消了聚餐。 "亲爱...
    白与梦阅读 224评论 0 0