2017-03-03 14 views
0

現在、データ構造を学習しており、TSでLinkedListを実装しようとするといくつかの問題に直面しています。いくつかの方法を追加しましたが、うまくいくようですが、出力は本当に奇妙です。TypedScriptのLinkedList実装

私の質問はコメントです。

私のコードは:

function LinkedList() {  //why doesn't fat arrow syntax work?? 
          //ie. let LinkedList =() => {...this.append =() => {}...} 
          // prints out TypeError: t.append is not a function 

let Node = (elem) => { 
    this.elem = elem; 
    this.next = null; 
} 

this.head = null; 
this.len = 0; 

this.append = (elem) => { 

    let node = new Node(elem); 
    let current; 

    if(this.head === null){ 
     this.head = node; 
    } else { 
     current = this.head; 
     while(current.next){ 
      current = current.next; 
     } 
     current.next = node; 
    } 
    this.len++; 
} 

this.removeAt = (pos) => { 
    if(pos > -1 && pos < this.len){ 
     let current = this.head; 
     let previous; 
     let index = 0; 

     if(pos === 0){ 
      this.head = current.next; 
     } else { 
      while(index++ < pos){ 
       previous = current; 
       current = current.next; 
      } 
      previous.next = current.next; 
     } 
     this.len--; 
     return current.elem; 
    } else { 
     return null; 
    } 
} 


this.insert = (elem, pos) => { 
    if(pos > -1 && pos < this.len){ 
     let current = this.head; 
     let index = 0; 
     let previous; 
     let node = new Node(elem); 

     if(pos === 0){ 
      node.next = current; 
      this.head = node; 
     } else { 
      while(index++ < pos){ 
       previous = current; 
       current = current.next; 
      } 
      node.next = current; 
      previous.next = node; 
     } 
     this.len++; 
     return true; 
    } else { 
     return false; 
    } 
} 

this.toString =() => { 
    var current = this.head; 
    var str = ''; 
    while(current){ 
     str += current.elem; //output is undefinedundefinedundefined 
       // str += JSON.stringify(current); 
       // prints out {"next":{"next":{}}}{"next":{}}{} 
     current = current.next; 
    } 
    return str; 
} 

} 

let t = new LinkedList(); 
t.append('asd'); //Doesn't work with fat arrow function declaration 
t.append(1); 
t.append(0); 
console.log(t); 
let tt = t.removeAt(1); 
console.log(t,'tt', tt); 
t.insert('asd',2); 
let ttt = t.insert('a', 1) 
console.log(ttt); 
console.log(t); 
console.log(t.toString()); 
+3

ありますか? –

答えて

2

あなたが活字体で(人ではJavaScriptの擬似クラスを作成するための関数を使用)ES5のような構文を混合している私には思えます。あなたはそれをする必要はありません。正しいtypecriptを書いてください。それ以外の場合は、TypeScriptをまったく使用する必要はありません。

太い矢印の関数構文にも注意してください。それらが存在する理由は、機能を置き換えるものではありません。あなたの場合、それを使用する必要がある本当の理由はゼロです。実際には、それはおそらくあなたのコードを壊しているでしょう。彼らはthisのスコープとしてオリジナルの(グローバルな)スコープを使用しています。ではなく、 LinkedListインスタンス自体です。あなたが何をしようとしての

より正確に慣用的な実装では、このようなものになります。

class Node { 
    private elem; 
    private next; 

    constructor(elem) { 
     this.elem = elem; 
     this.next = null; 
    } 
} 

class LinkedList { 
    private head = null; 
    private len = 0; 

    public append(elem) { 
     let node = new Node(elem); 
     let current; 

     if (this.head === null) { 
      this.head = node; 
     } else { 
      current = this.head; 
      while (current.next) { 
       current = current.next; 
      } 
      current.next = node; 
     } 
     this.len++; 
    } 

    public removeAt(pos) { 
     if (pos > -1 && pos < this.len) { 
      let current = this.head; 
      let previous; 
      let index = 0; 

      if (pos === 0) { 
       this.head = current.next; 
      } else { 
       while (index++ < pos) { 
        previous = current; 
        current = current.next; 
       } 
       previous.next = current.next; 
      } 
      this.len--; 
      return current.elem; 
     } else { 
      return null; 
     } 
    } 


    public insert(elem, pos) { 
     if (pos > -1 && pos < this.len) { 
      let current = this.head; 
      let index = 0; 
      let previous; 
      let node = new Node(elem); 

      if (pos === 0) { 
       node.next = current; 
       this.head = node; 
      } else { 
       while (index++ < pos) { 
        previous = current; 
        current = current.next; 
       } 
       node.next = current; 
       previous.next = node; 
      } 
      this.len++; 
      return true; 
     } else { 
      return false; 
     } 
    } 

    public toString() { 
     var current = this.head; 
     var str = ''; 
     while (current) { 
      str += current.elem; //output is undefinedundefinedundefined 
      // str += JSON.stringify(current); 
      // prints out {"next":{"next":{}}}{"next":{}}{} 
      current = current.next; 
     } 
     return str; 
    } 
} 

let t = new LinkedList(); 
t.append('asd'); // Works fine 
t.append(1); 
t.append(0); 
console.log(t); // LinkedList 
let tt = t.removeAt(1); 
console.log(t, 'tt', tt); // LinkedList, 'tt', 1 
t.insert('asd', 2); 
let ttt = t.insert('a', 1) 
console.log(ttt); // true 
console.log(t); // LinkedList 
console.log(t.toString()); //asda0 

をしかし、誰型注釈がどこにもありませんので、少し目的を果たします。最低でも、ノードに注釈を付ける必要がありますので、より安定したコードを作成できます。

ボーナスとして:console.log()はオブジェクトを適切に表示できるため、LinkedListインスタンスを文字列に変換しません。代わりに、toString()はJavaScriptが文字列に変換する必要がある場合にのみ自動的に使用されます。だから、これは動作します:あなたは、クラスを使用していない理由は

console.log(t + ""); //asda0 
+0

詳細な回答ありがとうございました。注釈(ノード)をより具体的にすることはできますか? – kazanDipi

+0

あなたのコードはTypeScriptですが、[種類](https://www.typescriptlang.org/docs/handbook/basic-types.html)を強制するものではありません。あなたはオートコンプリートを取得しますが、それはまだまだダイナミックです。あなたはあなたに何らかの規則を施行させるつもりはありません。たとえば、LinkedListの場合、[generics](https://www.typescriptlang.org/docs/handbook/generics.html)を使用すると意味があります。特定のオブジェクトのみを追加することができますリストに入力します。型厳密言語の効率は、これらのタイプの構造体の使用に由来します。 – zeh

0
class Link{ 
    value: number; 
    nextNode: Link; 

    constructor(nodeValue, nodeReference){ 
     this.value = nodeValue; 
     this.nextNode = nodeReference; 
    } 
} 

class LinkedList{ 
    list: Link; 
    _length: number = 0; 
    insertLink(i: number): boolean { 
     if(this.list == null){ 
      this.list = new Link(i, null); 
      this._length++; 
      return true 
     }else{ 
      let temp = this.list; 
      while(temp.nextNode != null){ 
       temp = temp.nextNode 
      } 
      temp.nextNode = new Link(i, null); 
      this._length++; 
      return false 
     } 
    } 

    printLinkList(): void { 
     let temp = this.list; 
     if (this.list == null){ 
      console.log('empty linked list') 
     }else{ 
      while(temp.nextNode != null){ 
       console.log(temp.value); 
       temp = temp.nextNode; 
      } 
      //to show last element 
      console.log(temp.value) 
     } 
    } 

    //last occurrence of a given number 
    searchNodeByValue(i:number): number{ 
     let temp = this.list; 
     let counter = 1; 
     let position = null; 
     if(temp == null){ 
      console.log('empty list'); 
     }else{ 
      while(temp.nextNode != null){ 
       if(temp.value === i){ 
        position = counter; 
       } 
       counter++; 
       temp = temp.nextNode 
      } 
      //check if the last element of the node 
      if (temp.value === i){ 
       position = counter; 
      } 
     } 
     //console.log(position); 
     if(position == null){ 
      return 0; 
     }else{ 
      return position; 
     } 
    } 
    removeListItemByValue(i:number): boolean { 
     if(this.list == null){ 
      return true 
     }else{ 
      let itemPosition = this.searchNodeByValue(i); 
      if(itemPosition == 0){ 
       return true 
      }else{ 
       let temp = this.list; 

       //if its the first element in the stack 
       if(itemPosition == 1){ 
        this.list = this.list.nextNode; 
        return true 
       } 
       //if the element is not first or last 
       while(temp.nextNode.value != i){ 
        console.log('in here'); 
        temp = temp.nextNode; 
       } 
       temp.nextNode = temp.nextNode.nextNode 
      } 
      return true 
     } 
    } 
    removeListItemByPos(i:number): boolean { 
     let temp = this.list; 
     let counter:number = 1; 

     if(i > this._length) return false 

     if(i == 1){ 
      this.list = this.list.nextNode; 
      return true 
     } 

     while(counter != (i-1)){ 
      temp = temp.nextNode; 
      counter ++; 
     } 
     temp.nextNode = temp.nextNode.nextNode; 
    } 

    toString(): String{ 
     let current = this.list; 
     let str = ''; 
     while (current) { 
      str += current.value; //output is undefinedundefinedundefined 
      // str += JSON.stringify(current); 
      // prints out {"next":{"next":{}}}{"next":{}}{} 
      current = current.nextNode; 
     } 
     return str; 
    } 
} 

let obj = new LinkedList(); 
obj.insertLink(1); 
obj.insertLink(2); 
obj.insertLink(3); 
obj.insertLink(4); 

obj.removeListItemByPos(4); 
obj.insertLink(5); 
console.log(obj.toString()) 
関連する問題