为了账号安全,请及时绑定邮箱和手机立即绑定

从链表中删除奇数/偶数

从链表中删除奇数/偶数

不负相思意 2021-11-18 20:41:43
这是一个带有数据和下一个属性的标准链表。这就是我正在尝试的: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: 18found 2found 4found 16[ 15, 1, 2, 5, 7, 4, 3, 16 ] 所以它只删除循环外的第一个值,我如何删除其他值?编辑:添加了完整代码,但是,它要求我添加更多文本,除了我已经添加的内容之外,我没有更多要添加的内容。
查看完整描述

3 回答

?
慕神8447489

TA贡献1780条经验 获得超1个赞

你应该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());



查看完整回答
反对 回复 2021-11-18
?
喵喵时光机

TA贡献1846条经验 获得超7个赞

您非常接近,您需要保留对上次更新值的引用


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());



查看完整回答
反对 回复 2021-11-18
?
慕仙森

TA贡献1827条经验 获得超7个赞

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 List

removeAndFormateOutput("isEven");


// Test Case:2  Single Node

q.insertFirst(16);

removeAndFormateOutput("isEven");


q.insertFirst(13);

removeAndFormateOutput("isOdd");


// Test Case:3 Two Consecutive Even

q.insertFirst(16);

q.insertFirst(18);

removeAndFormateOutput("isEven");


// Test Case:3 Two Consecutive odd

q.insertFirst(11);

q.insertFirst(13);

removeAndFormateOutput("isOdd");


// Test Case:4 Random List

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.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();

}


查看完整回答
反对 回复 2021-11-18
  • 3 回答
  • 0 关注
  • 120 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信