2017-09-10 19 views
0
/** 
* Definition for singly-linked list. 
* function ListNode(val) { 
*  this.val = val; 
*  this.next = null; 
* } 
*/ 
/** 
* @param {ListNode} head 
* @return {boolean} 
*/ 
var isPalindrome = function(head) { 
    if(head === null){ 
     return true; 
    } 
    var current, runner; 
    current = head; 
    runner = head; 
    runner = reverseList(runner); 
    while(current !== null && runner !== null){ 
     if(current.val != runner.val){ 
      return false; 
     } 
     else{ 
      current = current.next; 
      runner = runner.next; 
     } 
    } 
    return true; 
}; 

ここに私の逆の機能があります。これは私が最も問題があると思うところです。 this postと同様の問題が発生していますが、オブジェクト参照の問題を修正する方法が正確にはわかりません。入力を与えるリンクされたリストが回文かどうか確認してください

var reverseList = function(head){ 
    var previous, current, next; 
    current = head; 
    previous = null; 
    next = null; 
    while(current !== null){ 
     next = current.next; 
     current.next = previous; 
     previous = current; 
     current = next; 
    } 
    head = previous; 
    return previous; 
} 

[1、3、4、5、1] trueを返すので、私は逆関数のみリンクされたリスト内の単一のノードを返して実行していると信じています。

何か助けていただければ幸いです。

+0

_単一のノードを返します。物事を信じる代わりに、あなたがreverseListが間違っているかどうかあなた自身でチェックすることができます。だから、アルゴリズム全体のどこにバグがあるかを尋ねるのではなく、誤った名前のリストを直接聞くことができます。 – lilezek

+0

'[1、3、4、5、1]'はリンクリストではありません。どのように正確に関数を呼び出しますか?あなたはどのような価値を関数に渡していますか? – Thomas

答えて

1

あなたの設定には2つのバグがありますが、私があなたに向けて指摘します...あなたがそれらを修正する方法についての答えを望むなら、私はあなたにそれらを与えることができますが、これは学習の問題のように見えますあなたを正しい方向に向けるだけです。

最初のバグは実際にはreverseList関数内にありますが、単一ノードを返すだけではないためです。問題は、元のリストを参照渡しして操作しているため、reverseList runnerの最後に[1、5、4、3、1]が含まれているため、headには[1、3 、4,5,1]。あなたの最初のリストを破壊することなく、逆リストを生成する方法を見てする必要があります...

第二に、isPalindrome内の反転後のロジックは、二つのリストが同じ長さになることを前提としていますが、1場合にtrueを返します。リストは他のプレフィックスに過ぎません(たとえば、headが操作後にのみ[1]になり、runnerに[1,5,4,3,1]が含まれている場合)

+0

これは私が必要としていたものです。助けていただきありがとうございます。 –

関連する問題