zoukankan      html  css  js  c++  java
  • python实现一个无序单链表

    class Node:
        """先定一个node的类"""
    
        def __init__(self, value=None, next=None):
            self.value = value
            self.next = next
    
        def getValue(self):
            return self.value
    
        def getNext(self):
            return self.next
    
        def setValue(self, new_value):
            self.value = new_value
    
        def setNext(self, new_next):
            self.next = new_next
    
    
    class LinkedList:
        """实现一个单向链表及其各类操作方法"""
    
        def __init__(self):
            """初始化空链表"""
            self._head = Node()
            self._tail = None
            self._length = 0
    
        def isEmpty(self):
            """检测是否为空"""
            return self._head is None
    
        def add(self, value):
            """add在链表前端添加元素:O(1)"""
            newnode = Node(value)
            newnode.setNext(self._head)
            # 注意这里的顺序不能和setNext()颠倒不然新增的节点找不到next
            self._head = newnode
    
        def append(self, value):
            """append在链表尾部添加元素:O(n)
            思路:遍历链表,在原链尾next指向新节点"""
            newnode = Node(value)
            if self.isEmpty():
                # 若为空表,将添加的元素设为第一个元素
                self._head = newnode
            else:
                # 从链首遍历链表
                current = self._head
                while current.getNext() is not None:
                    current = current.getNext()
                # 找到最后一个,直接设置它的next指向新增的节点
                current.setNext(newnode)
    
        def size(self):
            """获取链表的元素个数
            从链头head开始遍历到链尾,同时用变量累加经过的节点个数"""
            current = self._head
            while current is not None:
                current = current.getNext()
                self._length += 1
            return self._length
    
        def search(self, value):
            """查找元素是否在链表,找到返回True,否则返回False
            从链头head开始遍历到链尾,并判断当前节点的数据是否为目标value"""
            current = self._head
            found = False
            while current is not None and not found:
                if current.getValue() == value:
                    found = True
                else:
                    current = current.getNext()
            return found
    
        def remove(self, value):
            """删除一个元素
            遍历链表"""
            current = self._head
            previous = None
            found = False
    
            while not found:
                if current.getValue() == value:
                    found = True
                    # 找到后判断value是不是链首,是的话,head为value的下个节点
                    if not previous:
                        self._head = current.getNext()
                    else:
                        # 不是的话,将前一个节点的next指向要删除的节点的下一个节点
                        previous.setNext(current.getNext())
                elif current.getNext() is not None:
                    # 之前的节点指向当前节点
                    previous = current
                    # 并找下一个节点作为循环的当前节点
                    current = current.getNext()
                else:
                    raise ValueError('{} is not in LinkedList'.format(value))
    
        def index(self, value):
            """返回元素在链表的位置,找不到抛出ValueError错误
            遍历链表,并用count累加遍历过的每一个节点位置"""
            current = self._head
            count = 0
            found = False
    
            while current is not None and not found:
                if current.getValue() == value:
                    found = True
                else:
                    current = current.getNext()
                    count += 1
            if found:
                return count
            else:
                raise ValueError('{} is not in LinkedList'.format(value))
    
        def insert(self, position, value):
            """往链表position位置插入一个元素value"""
            # 如果是链首,直接add添加
            if position <= 1:
                self.add(value)
            # 如果是链尾,直接append
            elif position > self.size():
                self.append(value)
            # 中间位置插入,思路也是从头遍历,找到position位置之前一个节点插入
            # 并修改previous节点next指向新节点,新节点next指向position位置的节点
            else:
                temp = Node(value)
                previous = None
                count = 1
                current = self._head
                while count < position:
                    count += 1
                    previous = current
                    current = current.getNext()
    
                previous.setNext(temp)
                temp.setNext(current)
    
    
    if __name__ == '__main__':
        link = LinkedList()
        link.add(4)
        link.add(5)
        link.add(6)
        link.add(7)
        print(link.remove(4))
        print(link.size())
  • 相关阅读:
    2016.5.15——leetcode:Number of 1 Bits ,
    2016.5.14——leetcode-HappyNumber,House Robber
    记录学习过程
    npm 模块安装机制简介
    搭建Vue.js开发环境(window10)
    pwd 显示当前所在的工作路径
    Lucene 6.5.0 入门Demo
    java.lang.UnsupportedClassVersionError
    window.onload 和 $(document).ready(function(){}) 的区别
    plsql + 客户端 连接oracle数据库
  • 原文地址:https://www.cnblogs.com/hhsh/p/13062885.html
Copyright © 2011-2022 走看看