這些天我一直在研究 leetcode 問題,但我總是遇到解決方案具有 .next 語法的問題。通常我曾經在我的 VScode 控制臺中運行解決方案,看看會發生什么。但我的 Vscode 控制臺無法識別 .next 語法,所以......
有人可以用這個“83. Remove Duplicates from Sorted List”解決方案來解釋我嗎? https://leetcode.com/problems/remove-duplicates-from-sorted-list/description/
var deleteDuplicates = function(head) {
var current = head;
while(current) {
if(current.next !== null && current.val == current.next.val) {
current.next = current.next.next;
} else {
current = current.next;
}
}
return head;
};
deleteDuplicates([1,1,2,3,3])
我嘗試將解決方案放在我的 Vscode 控制臺上并使用 console.log() 來查看發生了什么,但由于某種原因,我的控制臺無法識別 .next 語法,盡管它在 leetcode 控制臺上運行良好
uj5u.com熱心網友回復:
問題主要在于問題的呈現方式。輸入看起來就像它的陣列一樣,因為它們的格式與 JS 陣列完全一樣。但是輸入應該是一個鏈表。在起始代碼的頂部有這樣的注釋:
/**
* Definition for singly-linked list.
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/
ListNode雖然從描述中肯定不是很明顯,但這是他們將提供給您的代碼的一個實體。(引數名稱head是為了暗示這一點,因為這是傳統上賦予單鏈表中初始節點的名稱。)
因此,您需要能夠提供這樣一個物件作為您自己的測驗的輸入。我們可以通過多種方式做到這一點。我們可以簡單地使用以下內容來顯示它們[1, 1, 2, 3, 3]:
const head1 = new ListNode (
1,
new ListNode (
1,
new ListNode (
2,
new ListNode (
3,
new ListNode (3)
)
)
)
)
或者,我們可以利用這樣一個事實,雖然我們有一個建構式,但它只有靜態屬性,完全跳過建構式來使用它進行測驗:
const head2 =
{val: 1, next: {val: 2, next: {val: 2, next: {val: 3, next: {val: 3, next: null}}}}}
這兩個看起來都很尷尬,所以也許我們可以撰寫代碼來將陣列轉換為正確的鏈表并回傳。但首先,我們如何顯示這些?我們可以console .log得到結果,但比較它們很尷尬。將它們轉換為更有用的格式會很好,這也是為我們的轉換代碼預熱的好方法。display這是一個我覺得很有用的簡單函式:
const display = (node) =>
node .val (node .next ? ` -> ${display (node .next)}`: '')
console .log (display (head1)) //=> '1 -> 1 -> 2 -> 3 -> 3'
console .log (display (head2)) //=> '1 -> 1 -> 2 -> 3 -> 3'
所以現在我們想從一個簡單的陣列開始,然后把它變成一個鏈表。這是一個相當簡單的遞回程序:
const fromArray = ([x, ...xs]) => xs .length > 0
? new ListNode (x, fromArray (xs))
: new ListNode (x)
在這里,我們將陣列視為一個遞回結構,一個值后跟一個null或另一個陣列。通過將我們的輸入解構為[x, ...xs],這是自動的,我們可以使用length屬性 onxs來確定我們何時達到了我們的基本情況。
使用display我們可以很容易地驗證這一點:
console .log (display (fromArray ([8, 6, 7, 5, 3, 0, 9])))
//=> 8 -> 6 -> 7 -> -> 5 -> 3 -> 0 -> 9
為了完整起見,讓我們也寫一個相反的方法:
const toArray = (node) => [
node .val,
... (node .next ? toArray (node .next) : [])
]
這使用相同型別的遞回結構,但相反,將結果(node .next如果存在)傳播到陣列中node .val
所以現在我們可以把所有這些放在一起
function ListNode(val, next) {
this.val = (val===undefined ? 0 : val)
this.next = (next===undefined ? null : next)
}
const fromArray = ([x, ...xs]) => xs .length > 0
? new ListNode (x, fromArray (xs))
: new ListNode (x)
const display = (node) =>
node .val (node .next ? ` -> ${display (node .next)}`: '')
const deleteDuplicates = (head) => {
let current = head
while (current) {
if (current .next !== null && current .val == current .next .val) {
current .next = current .next .next
} else {
current = current .next
}
}
return head
}
console .log (display (deleteDuplicates (fromArray ([1, 1, 2, 3, 3]))))
我們可以看到這個解決方案適用于樣本輸入。既然您擁有這些工具,那么看看您是否可以提出自己的方法可能會很有趣。(一個提示:我的方法可能會使用toArray并且fromArray中間有一些魔法;它可能不如這里的方法有效,但它很有趣。)
uj5u.com熱心網友回復:
老實說,我對您的最佳回答是在 Replit 在線 IDE 中的 node.js 中運行您的代碼。
-> https://replit.com/ ~
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/531675.html
