我的代码存在问题,无法在链表的特定索引处查找元素。
findElement(index) {
let currentNode = this.head;
let count = 0;
while (currentNode != null) {
if (count === index) {
return currentNode;
count++;
currentNode = currentNode.next;
}
return -1;
}
}
这样做时,我得到的是整个链表,而不是一个特定的节点。因此,如果我console.log(list.findElement(0)),我会得到整个链表。但是,如果我控制台日志console.log(list.findElement(1)),则得到-1。但是我想要的是第二个节点。以下是我的其余代码。不能完全确定我的findElement函数出了什么问题。
class Node {
constructor(value) {
this.value = value;
this.next = null;
}
}
class LinkedList {
constructor() {
this.head = null;
//Length
this.length = 0;
}
//Push-front
pushFront(value) {
let node = new Node(value);
node.next = this.head;
this.head = node;
this.length++;
}
//Pop-front
popFront() {
if (this.head != null) {
this.head = this.head.next;
}
this.length--;
}
//Push-back
pushBack(value) {
let node = new Node(value);
if (this.head === null) {
this.head = node;
} else {
let currentNode = this.head;
while (currentNode.next) {
currentNode = currentNode.next;
}
currentNode.next = node;
}
this.length++;
}
答案 0 :(得分:1)
findElement
函数中的逻辑存在一些问题。主要问题是count
永远不会从0更改,因此该函数仅在标头是所搜索元素(例如index === 0
)并且在其他任何输入上返回-1
时才起作用(此“失败“ return应该完全移到while
循环之外)。
这是一个count++
和currentNode = currentNode.next
从if
移到隐式else
的版本:
findElement(index) {
let currentNode = this.head;
let count = 0;
while (currentNode) {
if (count === index) { // found the element
return currentNode;
}
count++; // increment counter
currentNode = currentNode.next; // move to next node
}
return -1;
}
另一个问题是,如果在空白列表上调用popFront
,列表的长度将减少为-1
。减量应该是有条件的,也应是有条件的。这可能会在将来的实现中造成危害,但是由于您从不使用列表长度,因此可以完全删除它。
将所有内容放在一起,这是一个测试程序:
class Node {
constructor(value) {
this.value = value;
this.next = null;
}
}
class LinkedList {
constructor() {
this.head = null;
this.length = 0;
}
findElement(index) {
let currentNode = this.head;
let count = 0;
while (currentNode) {
if (count === index) {
return currentNode;
}
count++;
currentNode = currentNode.next;
}
return -1;
}
pushFront(value) {
let node = new Node(value);
node.next = this.head;
this.head = node;
this.length++;
}
popFront() {
if (this.head != null) {
this.head = this.head.next;
this.length--;
}
}
pushBack(value) {
let node = new Node(value);
if (this.head === null) {
this.head = node;
}
else {
let currentNode = this.head;
while (currentNode.next) {
currentNode = currentNode.next;
}
currentNode.next = node;
}
this.length++;
}
}
const ll = new LinkedList();
ll.pushBack(1);
ll.pushBack(2);
ll.pushBack(3);
console.log(ll);
console.log(`First node: ${ll.findElement(0).value}`);
console.log(`Second node: ${ll.findElement(1).value}`);
console.log(`Third node: ${ll.findElement(2).value}`);
console.log(`Invalid index: ${ll.findElement(22).value}`);
答案 1 :(得分:0)
在条件return
的第一行中有一条if (count === index)
语句,这阻止了进一步的代码执行(意味着currentNode = currentNode.next
将永远无法到达)。
您想将return currentNode
下移两行,以便在函数返回之前引用下一个节点。
findElement(index) {
let currentNode = this.head;
let count = 0;
while (currentNode != null) {
if (count === index) {
count++;
currentNode = currentNode.next;
return currentNode;
}
return -1;
}
}