1. 程式人生 > 程式設計 >python/golang 刪除連結串列中的元素

python/golang 刪除連結串列中的元素

先用使用常規方法,兩個指標:

golang實現:

type Node struct {
  value int
  next *Node
}

type Link struct {
  head *Node
  tail *Node
  lenth int
}

// 向連結串列中新增元素
func (link *Link) add(v int) {
  if link.lenth == 0 { // 當前連結串列是空連結串列
    link.head = &Node{v,nil}
    link.tail = link.head
    link.lenth = 1
  } else {
    newNond := &Node{v,nil}
    link.tail.next = newNond
    link.tail = newNond
    link.lenth += 1
  }
}

// 刪除連結串列中的元素(雙指標)
func (link *Link) remove(v int) {
  if link.lenth == 0 {
    fmt.Println("空連結串列,不支援該操作")
    return
  }
  var previous *Node = nil
  for current := link.head; current != nil; current = current.next {
    if current.value == v {
      if current == link.head { // 要刪除的是頭節點
        link.head = current.next
      } else if current == link.tail { // 要刪除的是尾節點
        previous.next = nil
        link.tail = previous
      } else { // 要刪除的是中間的節點
        previous.next = current.next
      }
      link.lenth -= 1
      break
    }
    previous = current
  }
}

// 列印連結串列
func (link *Link) printList() {
  if link.lenth == 0 {
    fmt.Println("空連結串列")
    return
  }
  for cur := link.head; cur != nil; cur = cur.next {
    fmt.Printf("%d ",cur.value)
  }
  fmt.Println()
}

python實現:

class Node:
  def __init__(self,value,next):
    self.value = value
    self.next = next

  def __str__(self):
    return str(self.value)

class Link:
  def __init__(self):
    self.head = None
    self.tail = None
    self.lenth = 0

  # 向連結串列中新增元素
  def add(self,v):
    if self.lenth == 0: # 當前連結串列是空連結串列
      self.head = Node(v,None)
      self.tail = self.head
      self.lenth = 1
    else:
      new_node = Node(v,None)
      self.tail.next = new_node
      self.tail = new_node
      self.lenth += 1

  # 列印連結串列
  def print(self):
    if self.lenth == 0:
      print('空連結串列')
      return
    cur = self.head
    while True:
      if cur == None:
        print()
        break
      print(cur,end=' ')
      cur = cur.next

  # 刪除連結串列中的元素
  def remove(self,v):
    if self.lenth == 0:
      return
    cur = self.head
    pre = None
    while True:
      if cur.value == v:
        if cur == self.head: # 要刪除的是頭節點
          self.head = cur.next
        elif cur == self.tail: # 要刪除的是尾節點
          pre.next = None
          self.tail = pre
        else: # 要刪除的是中間的節點
          pre.next = cur.next
        self.lenth -= 1
        break
      pre = cur
      cur = cur.next
      if cur == None:
        print("未找到",v)
        break

只使用使用一個指標實現連結串列的刪除:

python/golang 刪除連結串列中的元素

golang實現:

func (link *Link) remove_with_one_pointer(v int) {
  if link.lenth == 0 {
    return
  }
  if link.tail.value == v { // 要刪除的節點是尾節點,需特殊處理
    if link.lenth == 1 { // 如果連結串列只有一個節點
      link.head = nil
      link.tail = nil
    } else { //大於一個節點
      cur := link.head
      for ; cur.next.next != nil; cur = cur.next {
      } //找到尾節點的前一個節點
      cur.next = nil
      link.tail = cur
    }
    link.lenth -= 1
    return
  }
  //要刪除的節點在頭部/中間 的常規情況
  for cur := link.head; cur != nil; cur = cur.next {
    if cur.value == v {
      cur.value = cur.next.value
      cur.next = cur.next.next
      link.lenth -= 1
      return
    }
  }
  fmt.Println("未找到",v)
}

python實現:

def remove_with_one_pointer(self,v):
  if self.lenth == 0:
    return
  if self.tail.value == v: # 要刪除的節點是尾節點,需特殊處理
    if self.lenth == 1: # 如果連結串列只有一個節點
      self.head = None
      self.tail = None
    else: # 大於一個節點
      cur = self.head
      while True:
        if cur.next.next is None: # 找到尾節點的前一個節點
          break
        else:
          cur = cur.next
      cur.next = None
      self.tail = cur
    self.lenth -= 1
    return
  # 要刪除的節點在頭部/中間 的常規情況
  cur = self.head
  while True:
    if cur.value == v:
      cur.value = cur.next.value
      cur.next = cur.next.next
      self.lenth -= 1
      break
    cur = cur.next
    if cur is None:
      print('未找到',v)
      break

以上就是python/golang 刪除連結串列中的元素的詳細內容,更多關於python/golang 連結串列的資料請關注我們其它相關文章!