python3 鏈表實現

以下爲單向鏈表實現

# -*- coding:utf-8 -*-
class ListNode:
    def __init__(self,x):
        self.val = x
        self.next = None

class ListLink:
#初始化
    def __init__(self):
        self.length = 0
        self.head = None
    
#判斷鏈表是否爲空
    def is_empty(self):
        return (self.length==0)

#建表
    def cre_link(self,data):
        if len(data)==0:
            return False
        self.head = ListNode(data[0])
        self.length += len(data)
        pHead = self.head
        for i in data[1:]:
            node = ListNode(i)
            pHead.next = node
            pHead = pHead.next
        return True

#升序排序
    def ascend(self):
        if self.is_empty() or self.length==1:
            return False
        p = self.head
        lis = []
        while p:
            lis.append(p.val)
            p = p.next
        lis.sort()
        ptmp = self.head
        i = 0
        while ptmp:
            ptmp.val = lis[i]
            i += 1
            ptmp = ptmp.next
        return True

#降序排序
    def descend(self):
        if self.is_empty() or self.length==1:
            return False
        p = self.head
        lis = []
        while p:
            lis.append(p.val)
            p = p.next
        lis.sort()
        ptmp = self.head
        i = len(lis)-1
        while ptmp:
            ptmp.val = lis[i]
            i -= 1
            ptmp = ptmp.next
        return True

#結點插入,升序插入
    def insert(self, pnode):
        if self.is_empty():
            return False
        ptmp = self.head
        self.length += 1
        if pnode.val < ptmp.val:
            pnode.next = self.head
            self.head = pnode
            return True
        else:
            p = ptmp
            ptmp = ptmp.next
            while ptmp:
                if p.val < pnode.val and pnode.val < ptmp.val:
                    pnode.next = ptmp
                    p.next = pnode
                    return True
                p = ptmp
                ptmp = ptmp.next
            p.next = pnode

        return True

#結點插入,按給的索引位置index插入
    def insert_index(self,index,pnode):

        if self.head is None or index > self.length :
            return False
        #表頭插入
        if index == 0 :
            pnode.next = self.head
            self.head = pnode
            self.length += 1
            return True
        #表尾插入
        if index == self.length:
            p = self.head
            while p.next:
                p = p.next
            p.next = pnode
            self.length += 1
            return True
        j = 0
        ptmp = self.head
        while j < index-1:
            ptmp = ptmp.next
            j += 1
        #print('**************')
        pnode.next = ptmp.next
        ptmp.next = pnode
        self.length += 1
        return True

#刪除指定位置index處的結點
    def delete(self,index):
        if self.is_empty():
            return False
        if index<0 or index>=self.length :
            return False
        if index == 0:
            self.head = self.head.next
            self.length -= 1
            return True
        j = 0
        ptmp = self.head
        while j < index:
            ptmp = ptmp.next
            j += 1
        ptmp.val = ptmp.next.val
        ptmp.next = ptmp.next.next
        self.length -= 1
        return True

#更新指定位置index處的結點值
    def update(self,index,data):
        if self.is_empty():
            return False
        if index <0 or index >= self.length:
            return False
        ptmp = self.head
        j = 0
        while j<index:
            ptmp = ptmp.next
            j += 1
        ptmp.val = data
        return True

#查找index處的結點值
    def select(self,index):
        if self.is_empty():
            return False
        if index <0 or index >= self.length:
            return False
        ptmp = self.head
        j = 0
        while j<index:
            ptmp = ptmp.next
            j += 1
        print('the value in location of '+str(index)+' is '+str(ptmp.val))
        return True

#遍歷輸出鏈表
    def traveling(self):
        if self.is_empty():

            return False
        else:
            tmp=self.head

            while tmp!=None:

                #print(str(tmp.val),end=' ')
                print(tmp.val, end=' ')
                tmp = tmp.next
            print()
            return True

#測試
if __name__ == '__main__':

    ll = ListLink()
    data = [555,2,333,4,5,6]
    #print(len(data))
    ll.cre_link(data)
    aa = 1
    dd = ListNode(99)
    ll.insert_index(1, dd)
    ll.traveling()
    ll.select(aa)
    ll.update(4,666)
    print('after update:')
    ll.traveling()
    ll.delete(1)
    ll.traveling()
    ll.delete(0)
    ll.traveling()
    ll.ascend()
    ll.traveling()
    ll.descend()
    ll.traveling()

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章