python链表实现及一些操作

1.设计Node结构,包括一个元素域(elem)和链接域(next)

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

2.设计单链表结构,由Node节点构成

class List(object):
    # 初始化
    def __init__(self):
        self.head=None

    #判断是否为空 True为空,False为不空
    def is_empty(self):
        return self.head is None

    #首端添加
    def preappend(self,elem):
        p=Node(elem)
        p.next=self.head
        self.head=p
        # self.head=Node(elem,self.head)

    #首端删除
    def prepop(self):
        if self.is_empty() is False:
            e=self.head.elem
            self.head=self.head.next
            return e

    #从小到大排序
    def sort(self):
        if self.head is None:
            return
        q=self.head.next#从第二个Node开始比较
        while q is not None:
            p=self.head
            while p is not q and p.elem<=q.elem:#直到遇到比首元素大的节点退出
                p=p.next
            while p is not q:#把大于首节点元素的Node的elem交换
                p.elem,q.elem=q.elem,p.elem
                p=p.next
            q=q.next


    #尾端添加
    def append(self,elem):
        if self.head is None:
            self.head=Node(elem)
            return
        p=self.head
        while p.next:
            p=p.next
        p.next=Node(elem)

    #显示数据
    def show(self):
        if self.head:
            p=self.head
            while p:
                yield p.elem
                p=p.next

    #删除尾端元素
    def pop(self):
        if self.head:
            if self.head.next is None:
                print(self.head.elem)
                self.head=None
            else:
                p=self.head
                while p.next.next:
                    p=p.next
                print(p.next.elem)
                p.next=p.next.next

    #删除指定元素
    def remove(self,elem):
        if self.head:
            if self.head.elem==elem:
                self.head=self.head.next
            else:
                q=self.head
                while q.next:
                    if q.next.elem==elem:
                        q.next=q.next.next
                    q=q.next

需要注意的是,部分操作需要判断链表是否为空然后进行

3.以上操作基本构成了一个简单的单链表,

(1)测试Node

if __name__=='__main__':
    node1=Node(1)
    p=node1
    for i in range(2,11):
        p.next=Node(i)
        p=p.next
    p=node1
    while p:
        print(p.elem,end=' ')
        p=p.next

输出结果为:

1 2 3 4 5 6 7 8 9 10 

(2)测试链表

if __name__=='__main__':
    List1=List()
    for i in range(5):
        List1.append(i)
    for x in List1.show():
        print(x,end=' ')
    print()
    List1.remove(2)
    print('删除2后:')
    for x in List1.show():
        print(x,end=' ')

输出结果为:

0 1 2 3 4 
删除2后:
0 1 3 4 

4.扩展单链表

(1)增加last链接域,使从链表末尾的时间复杂度由O(n)变为O(1),不过也增加了相应的空间复杂度

class LList(List):
    def __init__(self):
        List.__init__(self)
        self.last=None

    def preappend(self,elem):
        if self.head is None:
            self.head=Node(elem)
            self.last=self.head
        else:
            q=Node(elem)
            q.next=self.head
            self.head=q

    def append(self,elem):
        if self.head is None:
            self.head=Node(elem)
            self.last=self.head
        else:
            q=Node(elem)
            self.last.next=q
            self.last=q

    def pop(self):
        if self.head:
            if self.head.next is None:
                print(self.head.elem)
                self.head=None
            else:
                p=self.head
                while p.next.next:
                    p=p.next
                print(p.next.elem)
                p.next=p.next.next
                self.last=p

(2)环链表,其特征是最后一个Node节点的next不在指向None,而是指向表的第一个节点

class LCLIst(object):
    def __init__(self):
        self.last=None

    def is_empty(self):
        return self.last is None

    #前端插入
    def preappend(self,elem):
        q=Node(elem)
        if self.last is None:
            q.next=q
            self.last=q
        else:
            q.next=self.last.next
            self.last.next=q

    #尾端加入
    def append(self,elem):
        q=Node(elem)
        if self.last is None:
            q.next=q
            self.last=q
        else:
            q.next=self.last.next
            self.last.next=q
            self.last=q

    #前端删除
    def prepop(self):
        if self.last is not None:
            self.last.next=self.last.next.next

    def show(self):
        if self.is_empty():
            return
        else:
            q=self.last.next
            while True:
                print(q.elem)
                if q.next is self.last.next:
                    break
                q=q.next

5.总结

其实弄懂链表原理之后,一些链表的方法也很好写的

猜你喜欢

转载自blog.csdn.net/qq_42402381/article/details/83514163