ALDS1_3_C Doubly Linked List (java)
問題
双方向連結リスト | アルゴリズムとデータ構造 | Aizu Online Judge
javaで双方向リストの実装に挑戦しました。以下のページを参考にしました。
プログラミング/11 - CourseWiki
この問題でjavaにおける参照について、なんとなく理解できた気がします。
ポインタのポインタを使ったりするC言語と違って、なんだか直感的だなあと思いました。
import java.util.Scanner; class Cell { private int data; private Cell next; private Cell prev; Cell(int x){ data=x; next=null; prev=null;} void setNext(Cell n){ next=n; } void setPrev(Cell p){ prev=p; } Cell getNext(){ return next; } Cell getPrev(){ return prev; } int getData(){ return data; } } class DoubleLinkList { Cell Fdummy; Cell Rdummy; int num=0; DoubleLinkList(){ Fdummy=new Cell(-1); Rdummy=new Cell(-1); Fdummy.setNext(Rdummy); Rdummy.setPrev(Fdummy); } void insert(int x){ Cell a=new Cell(x); a.setPrev(Fdummy); a.setNext(Fdummy.getNext()); Fdummy.setNext(a); a.getNext().setPrev(a); num++; } void delete(int x){ Cell p=Fdummy.getNext(); while(p!=null){ if(p.getData() == x){ p.getPrev().setNext(p.getNext()); p.getNext().setPrev(p.getPrev()); num--; return; } p=p.getNext(); } } void deleteFirst(){ Fdummy.getNext().getNext().setPrev(Fdummy); Fdummy.setNext(Fdummy.getNext().getNext()); num--; } void deleteLast(){ Rdummy.getPrev().getPrev().setNext(Rdummy); Rdummy.setPrev(Rdummy.getPrev().getPrev()); num--; } void printa(){ Cell p=Fdummy.getNext(); while(num>0){ if(num>1) System.out.printf("%d ",p.getData()); else System.out.printf("%d\n",p.getData()); p=p.getNext(); num--; } } } class alds_3_c { public static void main(String[] args){ Scanner scan=new Scanner(System.in); DoubleLinkList L=new DoubleLinkList(); int n=scan.nextInt(); for(int i=0;i<n;i++){ String com=scan.next(); if(com.equals("insert")){ L.insert(scan.nextInt()); } else if(com.equals("delete")){ L.delete(scan.nextInt()); } else if(com.equals("deleteFirst")){ L.deleteFirst(); } else if(com.equals("deleteLast")){ L.deleteLast(); } } L.printa(); } }
ただ、最後のテストケースでTLEとなってしまいました。アルゴリズム自体はCでacceptされたものと変わらないので、なんでかなぁという感じです。