簡體   English   中英

如何理解while循環——鏈表

[英]how to understand while loop - linked list

所以我自己學習,並遇到了這段代碼來反轉鏈表:

function reverseLinkedList(linkedList) {
  let node = linkedList.head;
  let first = node;
  let next = null;
  let prev = null;

  while (next = node.next) {
    node.next = prev;
    prev = node;
    node = next;
  }

  linkedList.head = node;
  linkedList.head.next = prev;  
  linkedList.tail = first;

  return linkedList;
}

現在我的問題是,如果...不是條件語句,while(next = node.next) 是如何工作的。 我的猜測是,當到達尾節點並調用.next 時,它變成了 node.next 變得未定義,這反過來又打破了 while 循環。 但是,我並不肯定這種情況。

IIRC 它在語義上等於:

next = node.next
while (next) 
{
    // ...
}

這意味着,當next == null (或任何虛假值)時,循環的條件為false ,因此循環終止。

while (next = node.next) {
    node.next = prev;
    prev = node;
    node = next;
}

next = node.next
while (next != NULL) {
    node.next = prev;
    prev = node;
    node = next;
    next = node.next
}

在 JavaScript(以及許多其他具有這種語法的語言)中,賦值語句的結果是賦值。 因此,在這種情況下,while 會評估每個節點,它要么是一個值,要么不是一個值。 這樣您就可以像x = y = 5這樣的鏈接分配,而且您也可以將它們評估為條件。 請參閱: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Assignment

你是對的。 正如您所指出的, while循環在node.next變為undefined時停止執行。 它使用next = node.next的右側作為條件。 在這種情況下node.next

為了說明我的觀點,請考慮以下代碼:

let i = 0
const values = [1, 2, undefined, 3]
while (x = values[i]) {
  console.log(x);
  i += 1;
}

這將打印:

1
2

在達到undefined的那一刻停止執行(任何Falsy值都會產生相同的效果)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM