python实现链表

2021-06-16 09:04

阅读:585

标签:内存   lin   定义函数   ever   定义   数组   ret   src   +=   

链表:

链表不需要在内存存储一个连续的地方,通常就像一个链一样

它的每个节点包含本身和下一个元素的地址,以此来把两个元素进行关联,这就是一个链表

链表分单项和双向,一般单项就够用了。

链表存在的用意义:

链表是一个存储的数据结构,C语言中存数据用的是数组,存储所有的元素都是在内存中,每一个元素在内存中相连的位置,如果想删除一个元素,那么后边所有的元素都要向前移动一个位置,这样就提高了时间复杂度,如果是链表里的元素,如果删了一个数,那么把前一个的元素指向被删除元素的后一个元素就可以了,时间复杂度是O(1),数组里面的时间复杂度是O(n),效率不一样,所以这是链表存在的意义,比数组操作的效率高。

用于C语言中代替数组存储数据,效率会高一些

 

但是在python中直接用list就可以

链表里是用指针指向下一个元素的地址,但是python里没有指针,那就

用变量存一下下一个元素的地址,代替指针

链表定义:

 

链表可以用类的实例表示,实例有value和next属性,next指向下一个实例

 

定义节点

class p():pass

实例化一个实例,用a来执行它

a=P()

a指向P类的一个实例的地址

self.next=P(),指向下一个元素

最后一个元素的下一个指针域指向None

 技术分享图片

 

数据域 指针域(下一个节点的地址)

最后一个元素的指针域是None就结束了

 

定义节点类:

代码:

#encoding=utf-8

class Node:

    def __init__(self,value=None,next=None):#next(指针域)

        self.value=value

        self.next=next

 

n1=Node(1)

n2=Node(2)

n3=Node(3)

n1.next=n2

n2.next=n3

 

 

print "n1.value:",n1.value

print "n2.value:",n2.value

print "n2.value:",n3.value

 

print "######################"

print "n1.next.value:",n1.next.value

print "n2.next.value:",n2.next.value

print "n3.next:",n3.next

结果:

 技术分享图片

 

定义函数 打印出所有节点的值:

使用while循环判断,节点.next是否为空,不空,就打印

 

def printLinkedList(node):

    while True:

        if node.next != None:

            print node.value

        else:

            print node.value

            break

        node = node.next#从当前节点跳到下一个节点

 

 

printLinkedList(n1)

原理:判断最后一个元素的值是不是None

结果:

 技术分享图片

 

或者:

代码:

def printLinkedValue(node):

    while node is not None:

        print node.value

        node = node.next

    return ""

 

print printLinkedValue(n1)

结果:

D:\>python test.py

1

2

3

 

递归方式正序输出:

代码:

def printLinkedList(node):

    #递归

    #自己调用自己,并且有结束的条件,这是递归的原则

    if node.next is None:

        print node.value

        return

    print node.value

    printLinkedList(node.next)

    #return ""

 

printLinkedList(n1)

结果:

D:\>python test.py

1

2

3

 

 

拆解:

n1:1
printLinkedList(n2)
n2:2
printLinkedList(n3)
n3:3

 

 

递归方式逆序输出

def printReversedLinkedList(node):

    if node.next is None:

        print (node.value)

        return

    printReversedLinkedList(node.next)

    print (node.value)

    return None

 

printReversedLinkedList(n1)

结果:

 技术分享图片

 

 

n1-->n2--n3(打印3,返回)---打印一个2---》1

递归逆序图解:

技术分享图片

 

 

递归的时候是往回捣~~

相当于每次执行递归时,记个账本,最后一点点往前算账~~

 

 

链表类:

练习代码:

class LinkedList(object):

    def __init__(self,head=None):

        self.head = head

    #重写__len__函数计算链表长度

    def __len__(self):

        count = 0

        if self.head == None:

 

            print "b"*10

            return count

        print "c"*10

        node =self.head

        print "d"*10

        while node:

            print "e"*10

            count +=1

            node =  node.next

            print "f"*10

        return count

 

a=LinkedList(n1)

print len(a)

结果:

D:\>python test.py

cccccccccc

dddddddddd

eeeeeeeeee

ffffffffff

eeeeeeeeee

ffffffffff

eeeeeeeeee

ffffffffff

3

在链表末尾加入一个节点:

练习代码:

    def append(self,node):

        if self.head == None:

            self.head = node

            return node

        cur_node = self.head

        while cur_node.next != None:

            print cur_node.value

            cur_node = cur_node.next

        cur_node.next=node

 

        return cur_node.value

       

结果:

D:\>python test.py

1

2

3

4

4

查找一个节点:

练习代码:

    def find(self,value):

        if self.head == None:

            return

        cur_node = self.head

        while cur_node:

            if cur_node.value == value:

                print cur_node.value

                return cur_node

            else:

                cur_node = cur_node.next

       

   

a=LinkedList(n1)

print a.find(3)

结果:

D:\>python test.py

3

<__main__.node object at>

       

插入一个节点:

练习代码:

    def insertFront(self,data):

        if self.head == None:

            self.head = Node(data)

            return self.head

        else:

            tmp = self.head

            self.head=Node(data)

            self.head.next = tmp

        return self.head

           

       

a=LinkedList(n1)

print a.insertFront(5)

print a.insertFront(5).value

结果:

D:\>python test.py

<__main__.node object at>

5

 

删除列表中的某个值对应的节点:

练习代码:

    def delete(self,value):

        if self.head==None:

            return None

        elif self.head.value == value:

            self.head = self.head.next

        else:

            fro_node = None

            cur_node =  self.head

            while cur_node:

                if cur_node.value != value:

                    fro_node=cur_node

                    cur_node = cur_node.next

                else:

                    fro_node.next = cur_node.next

                    return cur_node.value

        return None

a=LinkedList(n1)

print a.delete(3)

结果:

D:\>python test.py

3

 

获取有所节点的值:

练习代码:

    def get_all(self):

        list=[]

        if self.head == None:

            return None

        else:

            cur_node = self.head

            while cur_node:

                list.append(cur_node.value)

                cur_node = cur_node.next

            return list

           

   

a=LinkedList(n1)

print a.get_all()

结果:

D:\>python test.py

[1, 2, 3]

 

所有练习代码:

#encoding=utf-8

 

class Node(object):

    def __init__(self,value=None,next=None):

        self.value=value

        self.next=next

   

n1=Node(1)

n2=Node(2)

n3=Node(3)

 

n1.next=n2

n2.next=n3

 

class LinkedList(object):

    def __init__(self,head=None):

        self.head = head

 

    def __len__(self):

        count = 0

        if self.head == None:

            return count

        node =self.head

        while node:

            count +=1

            node =  node.next

        return count

 

 

    def append(self,node):

        if self.head == None:

            self.head = node

            return node

        cur_node = self.head

        while cur_node.next != None:

            print cur_node.value

            cur_node = cur_node.next

        cur_node.next=node

 

        return cur_node.value

       

 

    def find(self,value):

        if self.head == None:

            return

        cur_node = self.head

        while cur_node:

            if cur_node.value == value:

                print cur_node.value

                return cur_node

            else:

                cur_node = cur_node.next

       

    

 

    def insertFront(self,data):

        if self.head == None:

            self.head = Node(data)

            return self.head

        else:

            tmp = self.head

            self.head=Node(data)

            self.head.next = tmp

        return self.head

           

       

    def delete(self,value):

        if self.head==None:

            return None

        elif self.head.value == value:

            self.head = self.head.next

        else:

            fro_node = None

            cur_node =  self.head

            while cur_node:

                if cur_node.value != value:

                    fro_node=cur_node

                    cur_node = cur_node.next

                else:

                    fro_node.next = cur_node.next

                    return cur_node.value

        return None

 

 

    def get_all(self):

        list=[]

        if self.head == None:

            return None

        else:

            cur_node = self.head

            while cur_node:

                list.append(cur_node.value)

                cur_node = cur_node.next

            return list

           

   

a=LinkedList(n1)

print a.get_all()

python实现链表

标签:内存   lin   定义函数   ever   定义   数组   ret   src   +=   

原文地址:https://www.cnblogs.com/xiaxiaoxu/p/9727017.html


评论


亲,登录后才可以留言!