链表与数组的转换

111 阅读1分钟
    function creatListNode(val) {
      return {
        value: val,
        next: null
      }
    }

1.数组转换成链表
    function arrayToList(array) {
      var dummy = creatListNode(0)
      var prevNode = dummy

      for (var i = 0; i < array.length; i++) {
        var node = creatListNode(array[i])   //由数组元素创建新的链表节点
        prevNode.next = node
        prevNode = node
      }

      return dummy.next
    }
    
2.链表转换成数组
    function listToArray(head) {
      var array = []
      var p = head
      while (p) {
        array.push(p.value)
        p = p.next
      }
      return array
    }
    
3.接受一个元素和一个链表,然后创建一个新的链表,将元素添加到输入链表的开头 
    function prepend(val, head) {
      var node = creatListNode(val)
      node.next = head
      return node
    }
    
4. 接受一个元素和一个链表,然后创建一个新的链表,将元素添加到输入链表的末尾
    function append(val, head) {
      var node = creatListNode(val)
      if (!head) {
        return node
      }
      var p = head
      while (p.next) {
        p = p.next
      }
      p.next = node
      return head
    }
    
5. 接受一个链表和一个数,并返回链表中指定位置的元素,如果该元素不存在则返回undefined
    
    function nth(head, n) {
      if (n < 0) {
        return
      }
      var count = 0
      var p = head
      while (p && count < n) {
        p = p.next
        count++
      }
      return p ? p.value : undefined
    }
    
    还可以简化成如下:
    function nth(head, n) {
      if (n < 0) {
        return
      }
      var p = head
      while (p && n--) {
        p = p.next
      }
      return p ? p.value : undefined
    }
    
    递归版本:
    function nth(head, n) {
      if (!head || n < 0) {
        return undefined
      }
      if (n == 0) {
        return head.value
      }
      return nth(head.next, n--)
    }