1. 程式人生 > >python 單鏈表的操作

python 單鏈表的操作

 單鏈表的基本操作

首先建立一個結點類的結構,以便後面的操作

class Node(object):
    def __init__(self,data):
    self.data=data
    self.next=None

 建立一個連結串列類

class LinkList(object):
    def __init__(self):
        self.head=Node(None)

    #判斷是否為空
    def isEmpty(self):
        p=self.head#頭指標
        if p.next==None:
            print("Link is Empty")
            return True
        return False
    #列印連結串列
    def printLink(self):
        if self.isEmpty():
            return False
        p=self.head
        while p:
            print(p.data,end='')
            p=p.next

 建立單鏈表是一個動態生成連結串列的過程,就是從一個空的單鏈表開始,依次建立各個元素的結點,並把它們依次插入連結串列

    def InitList(self,data):
        self.head=Node(data[0])#頭結點
        p=self.head#頭指標

        for i in data[1:]:
            node=Node(i)
            p.next=node
            p=p.next

計算單鏈表的長度

在使用連結串列時,經常需要求表的長度,為此建立一個求表長的函式,從左到右,遍歷表中所有的元素,並完成計數

    def LengthList(self):
        if self.isEmpty():
            return 0
        p=self.head
        cut=0
        while p:
            cut+=1
            p=p.next
        return cut

 單鏈表的插入

假設我們要把結點q插入到結點p的後面,只要把結點q插入到結點p和結點p.next 之間就行。

只要讓q.next和p.next 指標改變,讓p的後繼結點改為q的後繼結點,再把q的後繼結點變成p的後繼結點,插入操作的順序不能打亂

    def InsertList(self,s,data):
        if self.isEmpty() or s<0 or s>self.LengthList():
            print("Insert failed")
            return
        p=self.head
        index=1
        while index<s:
            p=p.next
            index+=1
        node=Node(data)
        node.next=p.next
        p.next=node

表單的刪除

如果想要刪除結點q,其實就是把它的前繼結點p指標繞過q,直接指向q的後繼結點 如圖

讓p.next 直接為p 的next  的 next , p  的next 為q ,所有就是p.next=q.next

 def DeleList(self,s):
        if self.isEmpty() or s<0 or s>self.LengthList():
            print("Dele failed")
            return
        index =1
        p=self.head

        while index<s:
            pre =p
            index+=1
            p=p.next

        pre.next=p.next
        p=None

 

整體程式碼如下

 

#-*- coding:utf-8 -*-
#__auther__:WM
class Node(object):
    #定義一個結點類
    def __init__(self,data):
        self.data=data
        self.next=None
#建立一個連結串列類
class LinkList(object):
    def __init__(self):
        self.head=Node(None)

    #判斷是否為空
    def isEmpty(self):
        p=self.head#頭指標
        if p.next==None:
            print("Link is Empty")
            return True
        return False
    #列印連結串列
    def printLink(self):
        if self.isEmpty():
            return False
        p=self.head
        while p:
            print(p.data,end='')
            p=p.next
    #建立單鏈表
    def InitList(self,data):
        self.head=Node(data[0])#頭結點
        p=self.head#頭指標

        for i in data[1:]:
            node=Node(i)
            p.next=node
            p=p.next

    #單鏈表的長度
    def LengthList(self):
        if self.isEmpty():
            return 0
        p=self.head
        cut=0
        while p:
            cut+=1
            p=p.next
        return cut
    #單鏈表的插入

    def InsertList(self,s,data):
        if self.isEmpty() or s<0 or s>self.LengthList():
            print("Insert failed")
            return
        p=self.head
        index=1
        while index<s:
            p=p.next
            index+=1
        node=Node(data)
        node.next=p.next
        p.next=node

    #單鏈表的刪除操作
    def DeleList(self,s):
        if self.isEmpty() or s<0 or s>self.LengthList():
            print("Dele failed")
            return
        index =1
        p=self.head

        while index<s:
            pre =p
            index+=1
            p=p.next

        pre.next=p.next
        p=None

    #單鏈表的讀取
    def GetList(self,s):
        if self.isEmpty()or s<0 or s>self.LengthList():
            print("error!")
            return
        index=1
        p=self.head
        while index<s:
            index+=1
            p=p.next
        print("第{}個值是{}".format(s,p.data))