链表模拟栈

定义节点 

class Node {
  var num: Int = _
  var next: Node = _

  def this(num: Int) {
    this
    this.num = num
  }

  override def toString: String = s"num=[${this.num}]"
}

定义方法



class LinkStack {
  private var head = new Node(0)

  def getHead: Node = head

  //判断是否为空
  def isEmpty: Boolean = {
    head.next == null
  }

  //无需判断是否为满

  //查看当前链表
  def list(): Unit = {
    if (isEmpty) {
      println(s"栈已空")
      return
    }
    var temp = head.next
    while (temp.next != null) {
      println(s"${temp}")
      temp = temp.next
      Thread.sleep(500)
    }
  }

  //入栈
  def push(value: Int): Unit = {
    if (isEmpty) head.next = new Node(1)
    //使用头插法
    val newNode = new Node(value)
    newNode.next = head.next
    head.next = newNode
  }

  //出栈
  def pop(): Int = {
    if (isEmpty) throw new RuntimeException("栈空")
    val temp = head.next
    if (temp.next != null) {
      println(s"弹栈=>${temp.num}")
      head = temp.next
    } else {
      println(s"弹栈=>${temp.num}")
    }
    temp.num
  }
}

主函数

package Algotithm

object LinkedListStackDemo {
  def main(args: Array[String]): Unit = {
    val stack = new LinkStack
    stack.push(1)
    stack.push(3)
    println(s"原链表=====")
    stack.list()
    println(s"弹栈一次=====")
    stack.pop()
    stack.list()
    println(s"弹栈二次=====")
    stack.pop()
    stack.list()
    
  }

}

结果 

总结

1、入栈时使用头插法,将新节点插入在 head头节点后面

2、 pop出栈 时需要对当前链表进行非空判定。如果取出后节点为空,则不需要对 head.next 进行赋值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值