數據結構-鏈表操作(Python)

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

'''
    方法說明
    __init__:初始化方法
    obtainListLen:輸出表元素    
    obtainListElems:輸出表長度
    插入元素
        -prepend:首段插入元素O(1)
        -append:尾端插入元素O(n)
        -insert:定位插入元素O(n)
    刪除元素
        -popleft:刪除首端元素O(1)
        -popright:刪除尾端元素O(n)
        -delete:定位刪除元素O(n)
    reverse: 鏈表反序
    sorting:鏈表排序(asc正序 | desc反序)
    '''
class LinkList:
    def __init__(self):
        self.head = None
    
    def obtainListElems(self):
        p = self.head
        elems = []
        if p == None:
            return elems
        else:
            while p != None:
                elems.append(p.elem)
                p = p.next
            return elems
    
    def obtainListLen(self):
        p,n = self.head,0
        while p != None:
            n += 1
            p = p.next
        return n
    
    def prepend(self,elem):
        self.head = Node(elem,self.head)
    def popleft(self):
        if self.head == None:
            return 'list is empty and can not pop'
        e = self.head.elem
        self.head = self.head.next
        return e
    
    def append(self,elem):
        if self.head == None:
            self.head = Node(elem)
        else:
            p = self.head
            while p.next != None:
                p = p.next
            p.next = Node(elem)
    def popright(self):
        if self.head == None:
            return 'list is empty and can not pop'
        p = self.head
        if p.next == None:
            e = self.head.elem
            self.head = None
        else:
            while p.next.next != None:
                p = p.next
            e = p.next.elem
            p.next = None
        return e
    
    def insert(self,i,e):
        n = self.obtainListLen()
        if i == 0:
            self.prepend(e)
        elif i == n:
            self.append(e)
        elif i > 0 and i < n:
            i = i - 1
            p = self.head
            while p != None and i > 1:
                p = p.next
            q = Node(e)
            q.next = p.next
            p.next = q
        else:
            return 'insert is failed'
    def delete(self,i):
        n = self.obtainListLen()
        if i == 0:
            return self.popleft()
        elif i == n-1:
            return self.popright()
        elif i > 0 and i < n-1:
            i = i - 1
            p = self.head
            while p != None and i > 1:
                p = p.next
            e = p.next.elem
            p.next = p.next.next
            return e
        else:
            return 'insert is failed'
    
    def reverse(self):
        p = None
        while self.head != None:
            q = self.head
            self.head = q.next
            q.next = p
            p = q
        self.head = p
     
    def sorting_asc(self):
        if self.head == None:
            return 'list is empty'
        crt = self.head.next
        while crt != None:
            x = crt.elem
            p = self.head
            while p != crt and p.elem <= x:
                p = p.next
            while p != crt:
                y = p.elem
                p.elem = x
                x = y
                p = p.next
            crt.elem = x
            crt = crt.next
    def sorting_desc(self):
        if self.head == None:
            return 'list is empty'
        crt = self.head.next
        while crt != None:
            x = crt.elem
            p = self.head
            while p != crt and p.elem >= x:
                p = p.next
            while p != crt:
                y = p.elem
                p.elem = x
                x = y
                p = p.next
            crt.elem = x
            crt = crt.next

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