アルゴリズムトレーニング(三)---チェーンテーブル関連操作
2649 ワード
チェーンテーブル関連アクション
1.指定されたノードを削除し、時間複雑度O(1)
質問の説明:チェーンテーブルで指定したノードを削除します.チェーンテーブルは次のとおりです.
1->2->3->4>5;
3番目のノードを削除:
1->2->4->5;
問題の分析:
指定した位置のノードを削除し、時間の複雑さがO(1)を超えないようにし、指定したノードの次のノードの値を指定したノードの値を上書きし、指定したノードのnextをそのnextのnextに向ける.
コード実装:
ノード実装:public class List {
public int value;
public List next=null;
public List(int value)
{
this.value = value;
this.next =null;
}
}
チェーンテーブルを作成するにはpublic static List ListCreat(String list) {
list.trim();
if(list.length()==0)
return null;
String[] value =list.split(",");
String item = value[0];
List phead = new List(Integer.parseInt(item));
List p = phead;
for(int i = 1;i < value.length;i++){
List q = new List(Integer.parseInt(value[i]));
p.next = q;
p = p.next;
}
return phead;
}
削除アクション:public static void delete(int i,List head)//
{
List p = head;
for(int j=1;j
2.チェーンテーブル逆置き
問題の説明:
チェーンテーブルをその場で逆置きする
問題の分析:
3つのポインタを定義します.1つはヘッダポインタheadで、1つのポインタqはnullを指し、もう1つのポインタpはヘッダポインタの次のノードを指します.qポインタが最初にnullを指すのは、後続の操作を容易にするためです.操作中にチェーンテーブルの位置情報を失わないでください.
コード実装:public static List inverion(List head) {//
List q = null;
List p = head.next;
head.next = q;
while(p!=null) {
q = p;
p = p.next;
q.next = head;
head = q;
}
return head;
}
3.返信チェーンテーブルであるか否かを判断する
問題の分析:
スタックのストレージ構造を利用して実現できます.スタックのノードのvalueがループチェーンテーブルの値に1つ1つ対応しているかどうかを判断する.
コード実装:public static void Palindrome(List head) {//
Stack stack = new Stack();
List p = head;
while(p!=null) {
stack.push(p);
p = p.next;
}
int flag = 0;
List t = head;
while(t!=null) {
List q = stack.pop();
if(q.value!=t.value) {
flag = 1;
}
t = t.next;
}
if(flag == 1)
{
System.out.println("NO");
}else {
System.out.println("Yes");
}
}
4チェーンテーブルにリングがあるかどうかを判断する
問題の分析:
2つのポインタを定義し、1つのポインタp 1のステップ長は2であり、もう1つのp 2のステップ長は1であり、チェーンテーブルにループが存在する場合、2つのポインタは必ず出会う.出会ったときにループを終了し、ループが存在しなければループ終了の条件はp 1またはp 2が空のときである.
コード実装:public static void Circle(List head) {
List p1 = head;
List p2 = head;
int flag = 0;
while(p1!=null&&p2!=null) {
p1 = p1.next;
p2 = p2.next.next;
if(p1==p2) {
flag = 1;
System.out.println("YES");
break;
}
}
if(flag==0)
System.out.println("NO");
}
public class List {
public int value;
public List next=null;
public List(int value)
{
this.value = value;
this.next =null;
}
}
public static List ListCreat(String list) {
list.trim();
if(list.length()==0)
return null;
String[] value =list.split(",");
String item = value[0];
List phead = new List(Integer.parseInt(item));
List p = phead;
for(int i = 1;i < value.length;i++){
List q = new List(Integer.parseInt(value[i]));
p.next = q;
p = p.next;
}
return phead;
}
public static void delete(int i,List head)//
{
List p = head;
for(int j=1;j
public static List inverion(List head) {//
List q = null;
List p = head.next;
head.next = q;
while(p!=null) {
q = p;
p = p.next;
q.next = head;
head = q;
}
return head;
}
public static void Palindrome(List head) {//
Stack stack = new Stack();
List p = head;
while(p!=null) {
stack.push(p);
p = p.next;
}
int flag = 0;
List t = head;
while(t!=null) {
List q = stack.pop();
if(q.value!=t.value) {
flag = 1;
}
t = t.next;
}
if(flag == 1)
{
System.out.println("NO");
}else {
System.out.println("Yes");
}
}
public static void Circle(List head) {
List p1 = head;
List p2 = head;
int flag = 0;
while(p1!=null&&p2!=null) {
p1 = p1.next;
p2 = p2.next.next;
if(p1==p2) {
flag = 1;
System.out.println("YES");
break;
}
}
if(flag==0)
System.out.println("NO");
}