1.リンクリストの基本紹介
まず、リンクリストにはノードの形式でデータが格納されます。各ノードには、データフィールド(データ)とノードフィールド(次へ)が含まれます。コンピューター内のリンクリストの各ノードの格納場所は不連続でランダムです。利点はデータです。挿入と削除の方が優れており、データを見つける効率はあまり良くありません(リンクされたリストは静的データのようにランダムにデータを読み取ることができないため、対応するデータを順番に見つける必要があります)。
2.一方向リンクリスト
2.1。単一リンクリストとは
一方向リンクリストは電車のようなものです。すべてのノードが連続して接続され、ポインターの方向は同じです。つまり、リストの各ノードは、元のデータを格納するだけでなく、次のノードの格納アドレスも格納します。以下に示すように:
ノードクラスコードの実装
class SingleNode {
public Object object; //ノードデータ
public SingleNode next; //次のノードを
指すpublic SingleNode(){
}
public SingleNode(Object object、SingleNode next){
this.object = object;
this.next = next;
}
}
2.2。一方向リンクリストの実装(追加、削除、変更、表示)データ
/ **
*単一リンクリストの実装
* /
public class SingleLinkList {
private SingleNode first; //ヘッドノードを定義する
private SingleNode last; //テールノードを定義する
private int size; //リンクリストのノード数を定義する
/ **
*リンクリストを判断する空かどうか
* @return
* /
public boolean isEmpty(){
return first == null;
}
/ **
*リンクリストの先頭と末尾に要素を追加
*アイデア分析:リンクリストが空の場合、リンクリストと同等ヘッドにデータを追加して、新しく追加したノードをヘッドノード(テールノード)に割り当てます。
*リンクリストが空でない場合は、リンクリストのテールにデータを追加することと同じです。追加されたノード(つまり、last.next = node)、次に新しく追加されたノードを
*最後のノード(つまり、last = node)に割り当てます
* /
public void add(Object object){
SingleNode node = new SingleNode(object、null);
if(isEmpty()){
SingleNode temp = first;
first = node;
} else {
last.next = node;
}
last = node;
size ++;
}
/ **
*指定されたノードに要素を追加
*アイデア分析:最初に、追加された位置が条件を満たすかどうかを判断する必要があります(index> 0 && index <size)の場合、指定したインデックス位置にある要素とその前の位置にある要素を見つける必要があるため、
* 2つのポインターを使用して、インデックス位置にある要素と前の位置にある要素を記録し、最後に(before.next = node、node.next = temp)。これは、前のノード、現在のノード(temp)を指すノードと同じです。
* @param index
* @param object
* /
public void addElement(int index、Object object){
SingleNode node = new SingleNode(object、null);
if(index> 0 && index <size){
SingleNode before = null;
for(int i = 0; i <index; i ++){
before = temp;
temp = temp.next;
}
before.next = node;
node.next = temp;
size ++;
}
}
/ **
*表示链表中の节点元素
* /
public void show(){
if(!isEmpty()){
SingleNode current = first;
while(current!= null){
System.out.println(current.object);
current = current.next;
}
}
}
/ **
*指定されたノードの要素を取得
*アイデア分析:ポインターを定義し、指定された位置にループして、要素を取り出します
* @param index
* @return
* /
public Object get(int index){
if(index> 0 && index <size){
if(!
IsEmpty ()){ SingleNode temp = first;
for(int i = 0; i <index; i ++){
temp = temp.next;
}
return temp.object;
}
}
return null;
}
/ **
*指定されたノードの要素を削除
*アイデア分析:記録する2つのポインターを定義する必要があるノードと削除するノードの前のノードを削除して、before.next = temp.nextを配置します。
* @param index
* /
public void remove(int index){
if(index> 0 && index <size){
if(!isEmpty()){
SingleNode temp = first;
SingleNode beforeTemp = null;
for(int i = 0; i <index; i ++){
beforeTemp = temp;
temp = temp.next;
}
beforeTemp.next = temp.next;
}
}
}
/ **
*修改指定节点的指定元素
*
* @param index
* @param object
* /
public void update(int index、Object object){
if(index> 0 && index <size){
if(!isEmpty ()){
SingleNode temp = first ;
for(int i = 0; i <index; i ++){
temp = temp.next;
}
temp.object = object;
}
}
}
/ **
*リンクリストの逆印刷
*アイデアの分析:高度なスタックの使用機能。最初に要素をスタックに置き、次にそれを取り出します。
* /
public void rePrint(){
Stack <SingleNode> stack = new Stack <SingleNode>();
if(!isEmpty()){
SingleNode current = first;
while(current!= null){
stack.push(current);
current = current.next;
}
while(stack.size()> 0){
System.out.println(stack.pop()。object);
}
}
}
/ **
*将单链表反转
* /
public void reversetList(){
SingleNode current = first;
SingleNode before = null;
while(current!= null){
last = before;
before = current;
current = current.next;
before.next =最後;
}
現在=前;
while(current!= null){
System.out.println(current.object);
current = current.next;
}
}