zoukankan      html  css  js  c++  java
  • [Swift]LeetCode707. 设计链表 | Design Linked List

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
    ➤微信公众号:山青咏芝(shanqingyongzhi)
    ➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/
    ➤GitHub地址:https://github.com/strengthen/LeetCode
    ➤原文地址: https://www.cnblogs.com/strengthen/p/10506371.html 
    ➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
    ➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

    Design your implementation of the linked list. You can choose to use the singly linked list or the doubly linked list. A node in a singly linked list should have two attributes: val and nextvalis the value of the current node, and next is a pointer/reference to the next node. If you want to use the doubly linked list, you will need one more attribute prev to indicate the previous node in the linked list. Assume all nodes in the linked list are 0-indexed.

    Implement these functions in your linked list class:

    • get(index) : Get the value of the index-th node in the linked list. If the index is invalid, return -1.
    • addAtHead(val) : Add a node of value val before the first element of the linked list. After the insertion, the new node will be the first node of the linked list.
    • addAtTail(val) : Append a node of value val to the last element of the linked list.
    • addAtIndex(index, val) : Add a node of value val before the index-th node in the linked list. If index equals to the length of linked list, the node will be appended to the end of linked list. If index is greater than the length, the node will not be inserted.
    • deleteAtIndex(index) : Delete the index-th node in the linked list, if the index is valid.

    Example:

    MyLinkedList linkedList = new MyLinkedList();
    linkedList.addAtHead(1);
    linkedList.addAtTail(3);
    linkedList.addAtIndex(1, 2);  // linked list becomes 1->2->3
    linkedList.get(1);            // returns 2
    linkedList.deleteAtIndex(1);  // now the linked list is 1->3
    linkedList.get(1);            // returns 3
    

    Note:

    • All values will be in the range of [1, 1000].
    • The number of operations will be in the range of [1, 1000].
    • Please do not use the built-in LinkedList library.

    设计链表的实现。您可以选择使用单链表或双链表。单链表中的节点应该具有两个属性:val 和 nextval 是当前节点的值,next 是指向下一个节点的指针/引用。如果要使用双向链表,则还需要一个属性 prev 以指示链表中的上一个节点。假设链表中的所有节点都是 0-index 的。

    在链表类中实现这些功能:

    • get(index):获取链表中第 index 个节点的值。如果索引无效,则返回-1
    • addAtHead(val):在链表的第一个元素之前添加一个值为 val 的节点。插入后,新节点将成为链表的第一个节点。
    • addAtTail(val):将值为 val 的节点追加到链表的最后一个元素。
    • addAtIndex(index,val):在链表中的第 index 个节点之前添加值为 val  的节点。如果 index 等于链表的长度,则该节点将附加到链表的末尾。如果 index 大于链表长度,则不会插入节点。
    • deleteAtIndex(index):如果索引 index 有效,则删除链表中的第 index 个节点。

    示例:

    MyLinkedList linkedList = new MyLinkedList();
    linkedList.addAtHead(1);
    linkedList.addAtTail(3);
    linkedList.addAtIndex(1,2);   //链表变为1-> 2-> 3
    linkedList.get(1);            //返回2
    linkedList.deleteAtIndex(1);  //现在链表是1-> 3
    linkedList.get(1);            //返回3

    提示:

    • 所有值都在 [1, 1000] 之内。
    • 操作次数将在  [1, 1000] 之内。
    • 请不要使用内置的 LinkedList 库。

    Runtime: 168 ms
    Memory Usage: 19.3 MB
     1 class MyLinkedList {
     2     var list:[Int] = [Int].init()
     3     /** Initialize your data structure here. */
     4     init() {
     5         
     6     }
     7     
     8     /** Get the value of the index-th node in the linked list. If the index is invalid, return -1. */
     9     func get(_ index: Int) -> Int {
    10        if list.count > index {
    11            return list[index]
    12        }
    13         return -1
    14     }
    15     
    16     /** Add a node of value val before the first element of the linked list. After the insertion, the new node will be the first node of the linked list. */
    17     func addAtHead(_ val: Int) {
    18         if list.count > 0 {
    19             list.insert(val,at:0)
    20         } else {
    21             list.append(val)
    22         }
    23     }
    24     
    25     /** Append a node of value val to the last element of the linked list. */
    26     func addAtTail(_ val: Int) {
    27         list.append(val)
    28     }
    29     
    30     /** Add a node of value val before the index-th node in the linked list. If index equals to the length of linked list, the node will be appended to the end of linked list. If index is greater than the length, the node will not be inserted. */
    31     func addAtIndex(_ index: Int, _ val: Int) {
    32         if list.count > index {
    33             list.insert(val,at:index)
    34         } else if list.count == index {
    35             list.append(val)
    36         }
    37     }
    38     
    39     /** Delete the index-th node in the linked list, if the index is valid. */
    40     func deleteAtIndex(_ index: Int) {
    41         if list.count > index {
    42             list.remove(at:index)
    43         }
    44     }
    45 }
    46 
    47 /**
    48  * Your MyLinkedList object will be instantiated and called as such:
    49  * let obj = MyLinkedList()
    50  * let ret_1: Int = obj.get(index)
    51  * obj.addAtHead(val)
    52  * obj.addAtTail(val)
    53  * obj.addAtIndex(index, val)
    54  * obj.deleteAtIndex(index)
    55  */

    196ms

     1 class MyLinkedList {
     2  
     3     var list = [Int]()
     4 
     5     /** Initialize your data structure here. */
     6     init() {
     7            
     8     }
     9     
    10     /** Get the value of the index-th node in the linked list. If the index is invalid, return -1. */
    11     func get(_ index: Int) -> Int {
    12       if index < list.count {
    13           return list[index]
    14       }
    15 
    16       return -1
    17     }
    18     
    19     /** Add a node of value val before the first element of the linked list. After the insertion, the new node will be the first node of the linked list. */
    20     func addAtHead(_ val: Int) {
    21       list.insert(val, at: 0)
    22     }
    23     
    24     /** Append a node of value val to the last element of the linked list. */
    25     func addAtTail(_ val: Int) {
    26       list.append(val)
    27     }
    28     
    29     /** Add a node of value val before the index-th node in the linked list. If index equals to the length of linked list, the node will be appended to the end of linked list. If index is greater than the length, the node will not be inserted. */
    30      func addAtIndex(_ index: Int, _ val: Int) {
    31         if index <= list.count {
    32             list.insert(val, at: index)
    33         }
    34     }
    35     
    36     /** Delete the index-th node in the linked list, if the index is valid. */
    37     func deleteAtIndex(_ index: Int) {
    38       if index < list.count {
    39           list.remove(at: index)
    40       }
    41     }
    42 }

    216ms

      1 class MyLinkedList {
      2 
      3     private var count: Int = 0
      4     private var head: Node? = nil
      5     private var tail: Node? = nil
      6     
      7     init() {
      8         
      9     }
     10     
     11     public func get(_ index: Int) -> Int {
     12         return _get(index)?.val ?? -1
     13     }
     14     
     15     private func _get(_ index: Int) -> Node? {
     16         var curr = head
     17         
     18         for _ in 0..<index {
     19             curr = curr?.next
     20         }
     21         
     22         return curr
     23     }
     24     
     25     public func addAtHead(_ val: Int) {
     26         let node = Node()
     27         node.val = val
     28         
     29         if head == nil {
     30             head = node
     31             tail = node
     32         } else {
     33             node.next = head
     34             head?.prev = node
     35             head? = node
     36         }
     37         
     38         count += 1
     39     }
     40     
     41     public func addAtTail(_ val: Int) {
     42         let node = Node()
     43         node.val = val
     44         
     45         if head == nil {
     46             head = node
     47             tail = node
     48         } else {
     49             node.prev = tail
     50             tail?.next = node
     51             tail = node
     52         }
     53         
     54         count += 1
     55     }
     56     
     57     public func addAtIndex(_ index: Int, _ val: Int) {
     58         guard index <= count else { return }
     59         if index == 0 {
     60             addAtHead(val)
     61         } else if index >= count {
     62             addAtTail(val)
     63         } else {
     64             let node = _get(index - 1)
     65             let new = Node()
     66             new.val = val
     67             
     68             new.next = node?.next
     69             new.next?.prev = new
     70             new.prev = node
     71             node?.next = new
     72             
     73             count += 1
     74         }
     75     }
     76     
     77     public func deleteAtIndex(_ index: Int) {
     78         guard index < count else { return }
     79         if index == 0 {
     80             let node = head!
     81             if tail === node {
     82                 tail = nil
     83             }
     84             head = node.next
     85             head?.prev = nil
     86             node.next = nil
     87         } else if index >= count - 1 {
     88             let node = tail!
     89             tail = tail?.prev
     90             tail?.next = nil
     91             node.prev = nil
     92         } else {
     93             let node = _get(index)
     94             node?.prev?.next = node?.next
     95             node?.next?.prev = node?.prev
     96         }
     97         count -= 1
     98     }
     99     
    100     private class Node {
    101         var val: Int = 0
    102         var next: Node? = nil
    103         var prev: Node? = nil
    104     }
    105 }

    224ms

      1 class MyLinkedList {
      2     
      3     private class Node {
      4         var next: Node?
      5         var prev: Node?
      6         var val: Int
      7         
      8         init(_ val: Int, next: Node? = nil, prev: Node? = nil) {
      9             self.val = val
     10             self.next = next
     11             self.prev = prev
     12         }
     13     }
     14     
     15     private var head: Node?
     16     private var tail: Node?
     17     var count = 0
     18     var isEmpty: Bool {
     19         return count == 0
     20     }
     21     
     22     /** Initialize your data structure here. */
     23     init() {
     24         
     25     }
     26     
     27     /** Get the value of the index-th node in the linked list. If the index is invalid, return -1. */
     28     func get(_ index: Int) -> Int {
     29         guard index >= 0, index < self.count else {return -1}
     30         return getNodeForIndex(index).val
     31     }
     32     
     33     /** Add a node of value val before the first element of the linked list. After the insertion, the new node will be the first node of the linked list. */
     34     func addAtHead(_ val: Int) {
     35         guard let head = head else {
     36             self.head = Node(val)
     37             self.tail = self.head
     38             self.count += 1
     39             return
     40         }
     41         let newHead = Node(val, next: head, prev: nil)
     42         head.prev = newHead
     43         self.head = newHead
     44         self.count += 1
     45     }
     46     
     47     /** Append a node of value val to the last element of the linked list. */
     48     func addAtTail(_ val: Int) {
     49         guard let tail = tail else {
     50             self.head = Node(val)
     51             self.tail = self.head
     52             self.count += 1
     53             return
     54         }
     55         let newTail = Node(val, next: nil, prev: tail)
     56         tail.next = newTail
     57         self.tail = newTail
     58         self.count += 1
     59     }
     60     
     61     /** Add a node of value val before the index-th node in the linked list. If index equals to the length of linked list, the node will be appended to the end of linked list. If index is greater than the length, the node will not be inserted. */
     62     func addAtIndex(_ index: Int, _ val: Int) {
     63         guard index >= 0, index <= self.count else { return }
     64         guard index != 0 else {
     65             addAtHead(val)
     66             return
     67         }
     68         guard index != self.count else {
     69             addAtTail(val)
     70             return
     71         }
     72         let current = getNodeForIndex(index - 1)
     73         let newNode = Node(val, next: current.next, prev: current)
     74         current.next = newNode
     75         newNode.next?.prev = newNode
     76         self.count += 1
     77     }
     78     
     79     /** Delete the index-th node in the linked list, if the index is valid. */
     80     func deleteAtIndex(_ index: Int) {
     81         guard index >= 0, index < self.count else { return }
     82         guard self.count > 1 else {
     83             self.head = nil
     84             self.tail = nil
     85             self.count -= 1
     86             return
     87         }
     88         guard index != 0 else {
     89             self.head = self.head?.next
     90             self.head?.prev = nil
     91             self.count -= 1
     92             return
     93         }
     94         guard index != self.count - 1 else {
     95             self.tail = self.tail?.prev
     96             self.tail?.next = nil
     97             self.count -= 1
     98             return
     99         }
    100         let current = getNodeForIndex(index)
    101         let prev = current.prev!
    102         let next = current.next!
    103         prev.next = next
    104         next.prev = prev
    105         self.count -= 1
    106     }
    107     
    108     private func getNodeForIndex(_ index: Int) -> Node {
    109         if index < self.count / 2 {
    110             var current = self.head!
    111             for _ in 0..<index {
    112                 current = current.next!
    113             }
    114             return current
    115         } else {
    116             var current = self.tail!
    117             var i = self.count - 1
    118             while i > index {
    119                 current = current.prev!
    120                 i -= 1
    121             }
    122             return current
    123         }
    124     }
    125 }

    328ms

      1 class MyLinkedList {
      2     
      3     var head: ListNode?
      4     var tail: ListNode?
      5     var size: Int
      6     
      7     init(){
      8         self.size = 0
      9     }
     10     
     11     func get(_ index: Int) -> Int {
     12         
     13         if  index >= size {
     14             return -1;
     15         }
     16         
     17         var tempNode = head
     18         var i = 0
     19         while i < index {
     20             tempNode = tempNode?.next
     21             i += 1
     22         }
     23         
     24         return tempNode!.val
     25     }
     26     
     27     func addAtHead(_ val: Int){
     28         
     29         let node = ListNode(val)
     30         node.next = head
     31         head = node
     32         
     33         if tail == nil {
     34             tail = head
     35         }
     36         size += 1
     37     }
     38     
     39     func addAtTail(_ val: Int){
     40         let node = ListNode(val)
     41         if let tail = tail {
     42             tail.next = node
     43          }else {
     44             head = node
     45         }
     46         
     47         tail = node
     48         size += 1
     49         
     50         
     51     }
     52     
     53     func addAtIndex(_ index:Int, _ val: Int){
     54         
     55         if (index > self.size){
     56             return
     57         }
     58         
     59         if(index == self.size){
     60             self.addAtTail(val)
     61             return
     62         }
     63         
     64         if (index == 0) {
     65             self.addAtTail(val)
     66             return
     67         }
     68         
     69         
     70         //需要两个节点--插入位置的前结点,和插入位置的后(现)结点
     71         //index 位置前面的结点
     72         var tempNode = head
     73         var i = 0
     74         while i < index-1 {
     75             tempNode = tempNode?.next
     76             i += 1
     77         }
     78         
     79         let nextNode = tempNode?.next
     80         
     81         let node = ListNode(val)
     82         tempNode?.next = node
     83         node.next = nextNode
     84         
     85         size += 1
     86     }
     87     
     88     func deleteAtIndex(_ index:Int) {
     89         
     90         if index >= size {
     91             return;
     92         }
     93         
     94         if(index == 0){
     95             if(size == 1){
     96                 size = 0
     97                 head = nil
     98                 tail = nil
     99             }
    100             head = head?.next
    101             size -= 1
    102             return;
    103         }
    104         
    105         var tempNode = head
    106         
    107         for _ in 0..<index-1{
    108             tempNode = tempNode?.next
    109         }
    110         
    111         if index == size - 1{
    112             tail = tempNode
    113             tail?.next = nil
    114             size -= 1
    115             return;
    116         }
    117         
    118         let nextNode = tempNode?.next?.next
    119         tempNode?.next = nextNode
    120         size -= 1        
    121     }
    122 }
  • 相关阅读:
    自己写的一个校验IP、IP掩码、IP段的方法
    JS 数组方法splice的源码探究
    element ui 的时间选择控件
    浅谈闭包
    tensorFlow-深度学习训练并行模式
    tensorflow-TensorBoard
    tensorflow-RNN和LSTM
    tensorflow-TFRecord报错ValueError: Protocol message Feature has no "feature" field.
    tensorflow-mnist报错[WinError 10060] 由于连接方在一段时间后没有正确答复解决办法
    旋转图片,增加神经网络的准确率
  • 原文地址:https://www.cnblogs.com/strengthen/p/10506371.html
Copyright © 2011-2022 走看看