1. 程式人生 > 實用技巧 >連結串列小遊戲

連結串列小遊戲

<template>
  <div id="testActivity" class="main">
    <el-form :model="form" class="demo-form-inline">
      <el-form-item label="">
        <el-input v-model="form.value" placeholder="請輸入要排隊的序列,以逗號分隔" clearable @input="inputChange" />
      </el-form-item>
      <el-form-item label="">
        <el-input v-model="form.delValue" placeholder="請輸入從第幾個開始刪" clearable @input="delValueChange" />
      </el-form-item>
      <el-form-item>
        <el-button type="primary" @click="onSubmit">計算</el-button>
      </el-form-item>
      <p v-if="result">剩下的是:{{ result }}</p>
    </el-form>
  </div>
</template>

<script>

var person = [] //存放佇列
var len = 3 //從第幾個開始刪,預設第3個
// 替換中文逗號 function ReplaceChina(obj) { while (obj.indexOf(',') !== -1) { obj = obj.replace(/,/ig, ',') } return obj } function LList() { this.head = new Node('head') this.head.next = this.head this.find = find this.insert = insert this.display = display this.findPrevious = findPrevious this.remove = remove } function Node(element) { this.element = element this.next = null } 
//找到當前節點的上一個節點 function findPrevious(item) { var currNode = this.head while (currNode.next.element !== item) { currNode = currNode.next } return currNode } //顯示結果 function display() { var currNode = this.head const arr = [] while (currNode.next.element !== 'head') { arr.push(currNode.next.element) currNode = currNode.next } return arr } //找到當前節點的位置 function find(item) { var currNode = this.head while (currNode.element !== item) { currNode = currNode.next } return currNode } //插入一個節點 function insert(newElement, item) { var newNode = new Node(newElement) var current = this.find(item) newNode.next = current.next current.next = newNode } function remove(item) { var prevNode = this.findPrevious(item) //上一個節點 let nextDel = prevNode.next //下一個需要刪除的節點 prevNode.next = prevNode.next.next //刪除item節點(把item上一個節點的指標指向item的下一個節點,即刪除了item) let i = 0 while (i < len) { //找到第len個的元素,即下次要刪除的節點 if (nextDel.next.element === 'head') {//如果到了最開頭,則向後移一位,並退出此次迴圈,並不累計i的值 nextDel = nextDel.next continue } nextDel = nextDel.next i++ } return nextDel //返回下次要刪除的節點 }
export default { name: 'TestActivity', data() { return { form: { value: '', delValue: '' }, result: '', person: [] } }, mounted() { }, methods: { delValueChange(val) { len = Number(val) //格式化為數值型別 }, inputChange(val) { person = val.split(',')//把字串存入佇列陣列 }, onSubmit() { if (!this.form.value || !this.form.delValue) { this.$alertMessage('error', '請輸入必填項') return } const timesString = ReplaceChina(this.form.value) // 替換中文分號 person = timesString.split(',') if (this.form.delValue > person.length) { this.$alertMessage('error', '開始刪除的位置不能大於佇列總數') return } const first = 'head' let i = 0 const cities = new LList() //例項化一個例項 // 把person陣列放入cities連結串列 while (i < person.length) { if (i === 0) { cities.insert(person[0], first) } else { const j = i - 1 cities.insert(person[i], person[j]) } i++ } // 顯示當前排隊情況 cities.display() const length = len - 1 let delName = person[length] //當前要刪掉的節點
    //迴圈去刪掉節點,留下最後2個 while (person.length > 2) { delName = cities.remove(delName).element person = cities.display() this.result = person.join(',')//最後的結果 } } } } </script> <style scoped> .main{ padding: 20px ; } .main >>> .el-input__inner{ width: } </style> <style lang="scss" scoped> </style>