猿问

从链表中删除奇数/偶数

这是一个带有数据和下一个属性的标准链表。


这就是我正在尝试的:


class Node {

    constructor(data, next) {

        this.data = data;

        this.next = next;

    }

}


class LinkedList {

    constructor() {

        this.head = null;

    }


    insertFirst(data) {

        this.head = new Node(data, this.head);

    }


    size() {

        let counter = 0, node = this.head;


        while (node) {

            counter++;

            node = node.next;

        }


        return counter;

    }


    toArray() {

        let node = this.head;

        const result = [];


        while (node) {

            result.push(node.data);

            node = node.next;

        }


        return result;

    }



    removeEven() {

        let previous = this.head;

        let node = this.head.next;


        if (this.isEven(previous.data)) {

            console.log('outside loop, found one: ' + previous.data)

            this.head = this.head.next;

        }


        while (node) {

            if (this.isEven(node.data)) { 

                console.log('found ' + node.data); 

                previous.next = node.next;

            }


            node = node.next;

        }


    }


    isEven(num) { return num % 2 === 0 ? true : false; }

}


const q = new LinkedList();

q.insertFirst(16)

q.insertFirst(3)

q.insertFirst(4)

q.insertFirst(7)

q.insertFirst(5)

q.insertFirst(2)

q.insertFirst(1)

q.insertFirst(15)

q.insertFirst(18)

q.removeEven();


console.log(q.toArray());

和输出:


outside loop, found one: 18

found 2

found 4

found 16

[ 15, 1, 2, 5, 7, 4, 3, 16 ] 

所以它只删除循环外的第一个值,我如何删除其他值?


编辑:添加了完整代码,但是,它要求我添加更多文本,除了我已经添加的内容之外,我没有更多要添加的内容。


不负相思意
浏览 121回答 3
3回答

慕神8447489

你应该previous在循环中更新。class Node {  constructor(data, next) {    this.data = data;    this.next = next;  }}class LinkedList {  constructor() {    this.head = null;  }  insertFirst(data) {    this.head = new Node(data, this.head);  }  size() {    let counter = 0,      node = this.head;    while (node) {      counter++;      node = node.next;    }    return counter;  }  toArray() {    let node = this.head;    const result = [];    while (node) {      result.push(node.data);      node = node.next;    }    return result;  }  removeEven() {    let previous = this.head;    let node = this.head.next;    if (this.isEven(previous.data)) {      console.log('outside loop, found one: ' + previous.data)      this.head = this.head.next;    }    while (node) {      if (this.isEven(node.data)) {        console.log('found ' + node.data);        previous.next = node.next;      } else {        previous = node;      }      node = node.next;    }  }  removeOdd() {    let previous = this.head;    let node = this.head.next;    if (!this.isEven(previous.data)) {      console.log('outside loop, found one: ' + previous.data)      this.head = this.head.next;    }    while (node) {      if (!this.isEven(node.data)) {        console.log('found ' + node.data);        previous.next = node.next;      } else {        previous = node;      }      node = node.next;    }  }  isEven(num) {    return num % 2 === 0 ? true : false;  }}const q = new LinkedList();q.insertFirst(16)q.insertFirst(3)q.insertFirst(4)q.insertFirst(7)q.insertFirst(5)q.insertFirst(2)q.insertFirst(1)q.insertFirst(15)q.insertFirst(18)q.removeOdd();console.log(q.toArray());

喵喵时光机

您非常接近,您需要保留对上次更新值的引用class Node {  constructor(data, next) {    this.data = data;    this.next = next;  }}class LinkedList {  constructor() {    this.head = null;  }  insertFirst(data) {    this.head = new Node(data, this.head);  }  size() {    let counter = 0,      node = this.head;    while (node) {      counter++;      node = node.next;    }    return counter;  }  toArray() {    let node = this.head;    const result = [];    while (node) {      result.push(node.data);      node = node.next;    }    return result;  }  removeEven() {    let current = this.head;    let final;    while (current.next) {      if (this.isEven(current.data)) {        current = current.next;      } else {        if (!final) {          final = current          this.head = final        } else {          final.next = current          final = current        }        current = current.next      }    }    if (this.isEven(current.data)) {      final.next = null    }  }  isEven(num) {    return num % 2 === 0 ? true : false;  }}const q = new LinkedList();q.insertFirst(16)q.insertFirst(3)q.insertFirst(4)q.insertFirst(7)q.insertFirst(5)q.insertFirst(2)q.insertFirst(1)q.insertFirst(15)q.insertFirst(18)q.removeEven();console.log(q.toArray());

慕仙森

class Node {  constructor(data, next) {    this.data = data;    this.next = next;  }}class LinkedList {  constructor() {    this.head = null;  }  removeNodesWithNumberType(type = "isEven") {    if (!this.head) return;    let previousNode = this.head;    let traversingNode = this.head;    while (traversingNode) {      if (this[type](traversingNode.data)) {        this.removeNode(previousNode, traversingNode);      } else {        previousNode = traversingNode;      }      traversingNode = traversingNode.next;    }  }  removeNode(previousNode, node) {    if (this.isFirstNode(node)) this.head = node.next;    previousNode.next = node.next;  }  isFirstNode(node) {    return this.head === node;  }  isEven(num) {    return num % 2 === 0;  }  isOdd(num) {    return !this.isEven(num);  }  insertFirst(data) {    this.head = new Node(data, this.head);  }  size() {    let counter = 0,      node = this.head;    while (node) {      counter++;      node = node.next;    }    return counter;  }  toArray() {    let node = this.head;    const result = [];    while (node) {      result.push(node.data);      node = node.next;    }    return result;  }  clear() {    this.head = null;  }}const q = new LinkedList();// Test Case:1  Empty ListremoveAndFormateOutput("isEven");// Test Case:2  Single Nodeq.insertFirst(16);removeAndFormateOutput("isEven");q.insertFirst(13);removeAndFormateOutput("isOdd");// Test Case:3 Two Consecutive Evenq.insertFirst(16);q.insertFirst(18);removeAndFormateOutput("isEven");// Test Case:3 Two Consecutive oddq.insertFirst(11);q.insertFirst(13);removeAndFormateOutput("isOdd");// Test Case:4 Random Listq.insertFirst(3);q.insertFirst(4);q.insertFirst(7);q.insertFirst(5);q.insertFirst(2);q.insertFirst(1);q.insertFirst(15);q.insertFirst(18);q.insertFirst(20);removeAndFormateOutput("isEven");function removeAndFormateOutput(type) {  console.log(`Remove if ${type} \n Before : ${q.toArray()}`);  q.removeNodesWithNumberType(type);  console.log(` After : ${q.toArray()}\n`);  q.clear();}
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答