数据结构Python版(ing)

1.单向链表

11640553-249aeb8fca388113.png

单链表节点一个类,单链表一个类,单链表这个类中的元素都是节点类的。
单链表的操作:

  • is_empty() 链表是否为空
    取cur指向链表的首节点,判断是不是None

  • length() 链表长度
    取cur指向链表的首节点,设置count用来计数,当前指向若不为None,则计数+1,移动cur指向下一个节点。

  • travel() 遍历整个链表
    思路同链表长度,把计数的部分换成print

  • first_add(item) 链表头部添加元素


    11640553-358c23ef38bb207e.png

    新添加的元素需要定义成节点类的一个实例。新添加的元素就是头节点,新添加节点的下一个指向原链表的头节点。把链表的头节点指向新添加的节点。

  • last_add(item) 链表尾部添加元素
    新添加的元素需要定义成节点类的一个实例。
    判断当前链表是不是为空,如果是空,那这个链表的头节点指向新添加的节点。
    如果不是空,那就将cur指向头节点,按照travel()的思路遍历这个链表,一直走到最后一个节点,将最后一个节点的下一个元素设置为新添加的这个节点。注意判断是否最后一个节点的条件。

  • insert(pos, item) 指定位置添加元素


    11640553-91bec37f2c8ef744.png

    新添加的元素需要定义成节点类的一个实例。
    判断pos的值,如果pos<=0,则相当于在首部插入,调用首部插入的方法。
    如果pos的值>链表长度-1(注意这里pos的值是从0开始的),则相当于尾部插入,调用尾部插入的方法。
    否则:定义pre指向当前链表的头节点,用一个count计算当前指向的索引值,移动cur直到走到pos-1的位置,将新节点的下一个元素指向原链表这个位置的下一个元素,原链表的下一个位置指向新节点。见下图


    11640553-f0115518a7e94a84.png
  • remove(item) 删除节点

    扫描二维码关注公众号,回复: 5190677 查看本文章

    11640553-90cc3c0188ba7021.png

    定义两个指针,pre一开始是None,cur 指向原链表的头节点。如果删除的是头节点,那么把链表的头节点指向原链表头节点的下一个节点。如果不是头节点,就将pre指向当前cur的节点,cur的指向一个一个的往后挪,(这样就相当于pre在后,cur在前)直到cur指向的值就是我们要删除的值,把pre的下一个节点指向cur的下一个节点。

  • search(item) 查找节点是否存在
    思路同travel()


class Node(object):
    def __init__(self,item):
        self.item = item
        self._next = None



class singleLinkList(object):
    def __init__(self):
        # 头节点
        self._head = None
    def is_empty(self):
        return self._head == None

    def length(self):
        # 首先要指向头节点
        cur = self._head
        count = 0
        while cur is not None:
            count = count+1
            cur = cur._next
        return count

    def travel(self):
        if self.is_empty():
            return
        # 首先要指向头节点
        cur = self._head
        while cur != None:
            print(cur.item)
            cur = cur._next
        print("")
    def first_add(self,elem):
        # 把新添加的数定义到Node类里,这样它就会有item和_next两个属性
        p = Node(elem)
        p._next = self._head
        # 把链表的头节点指向新添加的节点
        self._head = p


    def last_add(self,elem):
        cur = self._head
        p = Node(elem)
        # 首先判断这个链表是不是空的
        if self.is_empty():
            self._head = p
        else:
            cur = self._head
            while cur._next != None:
                cur = cur._next
            cur._next = p
    def insert(self,index,elem):
        # 如果插入的地方在第一个位置之前,直接调用在首部插入的方法
        if index<=0 :
            self.first_add(elem)
        # 如果插入的地方在最后一个位置之后,直接调用在尾部插入的方法
        elif index>(self.length()-1):
            self.last_add(elem)
        else:
            p = Node(elem)
            count = 0
            pre = self._head
            while count<(index-1):
                pre = pre._next
                count = count+1
            p._next = pre._next
            pre._next = p

    def remove(self,elem):
        cur = self._head
        pre = None
        while cur is not None:
            if cur.item == elem:
                #  如果第一个就是要删除的节点
                if not pre:
                    self._head = cur._next
                else:
                    pre._next = cur._next
                break
            else:
                # 将删除位置前一个节点的next指向删除位置的后一个节点
                pre = cur
                cur = cur._next

    def search(self,elem):
        cur = self._head
        index = 0
        while cur is not None:
            if cur.item == elem:
                return index
            else:
                cur = cur._next
                index = index+1
        return index
if __name__ == "__main__":
    ll = singleLinkList()
    print("-------创建链表,首部加1,首部加2---------")
    ll.first_add(1)
    # print(ll.travel())
    ll.first_add(2)
    ll.travel()

    print("-------尾部添加3---------")
    ll.last_add(3)
    ll.travel()

    print("-------在索引为2的位置添加4---------")
    ll.insert(2, 4)
    print("length:",ll.length())
    ll.travel()

    print("-------查找链表中某一个数的索引---------")
    index = ll.search(2)
    print(index)

    print("-------删除链表中某一个数---------")
    ll.remove(3)
    # print "length:",ll.length()
    ll.travel()

2.循环单链表

  • 首部添加元素


    11640553-0f97dc603f173dff.png

    首先判断这个链表是不是空,如果是空,把头指针指向新添加的这个p节点,并且p节点的下一节点指向头节点。(因为是循环的)
    如果不是空,那么先把p节点的下一个节点指向头节点,然后往后走,找到最后一个节点,把原链表的最后一个节点的下一个节点指向新加入的p节点,并且把头指针指向这个p节点(因为是首部加入)

  • 尾部添加元素
    首先判断原链表是不是空的,如果是空的,就按照上面的,把头指针(self._head)指向新添加的这个p节点,并且p节点的下一节点指向头节点。
    如果不是空,就找到原链表的最后一个节点,将最后一个节点的下一节点指向p节点,然后p节点的下一个节点指向头节点,头指针(self._head)没变。
  • remove方法还需要好好看看。

class Node(object):
    def __init__(self,item):
        self.item = item
        self._next = None



class circularLinkList(object):
    def __init__(self):
        # 头节点
        self._head = None
    def is_empty(self):
        return self._head == None

    def length(self):
        # 首先要指向头节点
        cur = self._head
        count = 0
        while cur is not None:
            count = count+1
            cur = cur._next
        return count


    def travel(self):
        if self.is_empty():
            return
        # 首先要指向头节点
        cur = self._head

        while cur._next != self._head:
            print(cur.item)
            cur = cur._next
        print(cur.item)
        print("")


    def first_add(self,elem):
        # 把新添加的数定义到Node类里,这样它就会有item和_next两个属性
        p = Node(elem)
        if self.is_empty():
            self._head = p
            p._next = self._head
        else:
            # 首先将新加入的这个节点的下一个节点指向首节点
            p._next = self._head
            # 然后将原链表的尾节点指向这个新加入的节点
            cur = self._head
            while cur._next != self._head:
                cur = cur._next
            cur._next = p
            self._head = p


    def last_add(self,elem):

        p = Node(elem)
        # 首先判断这个链表是不是空的
        if self.is_empty():
            self._head = p
            p._next = self._head
        else:
            # 直接走到最后的节点
            cur = self._head
            while cur._next != self._head:
                cur = cur._next
            cur._next = p
            p._next = self._head



    def insert(self,index,elem):
        # 如果插入的地方在第一个位置之前,直接调用在首部插入的方法
        if index<=0 :
            self.first_add(elem)
        # 如果插入的地方在最后一个位置之后,直接调用在尾部插入的方法
        elif index>(self.length()-1):
            self.last_add(elem)
        else:
            p = Node(elem)
            count = 0
            pre = self._head
            while count<(index-1):
                pre = pre._next
                count = count+1
            p._next = pre._next
            pre._next = p

    def remove(self,elem):
        # 如果原链表为空
        if self.is_empty():
            return

        cur = self._head
        pre = None

        # 如果链表的第一个元素就是要删除的元素
        if cur.item == elem:
            # 如果链表多于一个节点,就找到最后一个节点
            if cur._next != self._head:
                while cur._next != self._head:
                    cur = cur._next
                cur._next = self._head._next
                self._head = self._head._next
            else:
                # 如果链表只有一个元素,就直接置空
                self._head = None
        else:
            pre = self._head
            while cur._next != self._head:
                # 如果找到了要找的元素
                if cur.item == elem:
                    pre._next = cur._next
                    return
                else:
                    pre = cur
                    cur = cur._next
            # cur指向了尾节点
            if cur.item == elem:
                pre._next = self._head



    def search(self,elem):
        if self.is_empty():
            return False
        cur = self._head
        index = 0
        while cur._next != self._head:
            if cur.item == elem:
                return index
            else:
                cur = cur._next
                index = index+1
        if cur.item == elem:
            return index
        else:
            return False

if __name__ == "__main__":
    ll = circularLinkList()
    # print(ll.length())
    ll.travel()
    print("--------首部添加----------")
    ll.first_add(2)
    ll.first_add(1)
    ll.first_add(99)
    ll.travel()
    print("--------尾部添加----------")
    ll.last_add(6)
    ll.travel()
    print("--------尾部添加----------")
    ll.last_add(5)
    ll.travel()
    print("--------移除元素----------")
    # ll.remove(5)
    # ll.travel()
    print("--------查找元素----------")
    print(ll.search(6))
   

3.冒泡排序(将大的数冒泡到最后)
思路:比较前后两个数的大小,从前到后比较到最后,这样第一次冒泡完最后一个数是整个里面最大的数,然后进行第二次冒泡,总共需要n-1次冒泡。

猜你喜欢

转载自blog.csdn.net/weixin_34026276/article/details/87568637
今日推荐