`

coffee实现LinkedList

 
阅读更多
class LinkedList
    
    constructor: ->
        # 首节点
        @_head = null
 
    # 添加节点
    add: (data) ->
        # 创建新节点
        node = data: data, next:null
        # 如果首节点为空, 则进行赋值; 否则设置遍历的起点为首节点
        current = @_head or = node
        # 判断是否只有一个节点
        if @_head isnt node
            # 遍历至最后一个节点
            current = current.next while current.next
            # 添加新节点至队列尾部
            current.next = node
        # 返回队列
        this
    
    #  查找节点
    item: (index) ->
        # 负数处理
        return null if index < 0
        # 第一个节点
        current = @_head or null
        i = -1
        # 遍历, 直至节点不会空且序号为index
        current = current.next while current and index > ++i
        # 返回节点的data值
        current and current.data
    
    # 删除节点
    remove: (index) ->
        # 负数处理
        return null if index < 0
        current = @_head or null
        i = -1
        # 当序号为0时
        if index is 0
            # 则将首节点的下一个节点提升为子节点
            @_head = current.next
        else
            # 序号>0时, 遍历获取目标节点以及其上一个节点
            [previous, current] = [current, current.next] while index > ++i
            # 将目标节点的上下级节点关联, 从而达到删除目标节点的效果
            previous.next = current.next
        # 返回被删除的目标节点的data值
        current and current.data
    
    # 计算队列大小
    size: ->
        current = @_head
        count = 0
        while current
            count += 1
            current = current.next
        count
    
    # 转化为Array
    toArray: ->
        result = []
        current = @_head
        while current
            result.push current.data
            current = current.next
        result
    
    # 转化为字符串
    toString: ->
        @toArray().toString()

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics