링크 된 목록은 복잡한 데이터 구조입니다. 데이터 간의 관계는 링크 된 목록을 단일 링크 목록, 원형 연결 목록 및 양방향 링크리스트의 세 가지 유형으로 나눕니다 . 다음은 하나씩 소개됩니다. 링크 된 목록은 데이터 구조의 기본적이고 중요한 지식 지점입니다. 여기서 우리는 Java에서 링크 된 목록의 구현에 대해 이야기 할 것입니다.
Java 링크 된 목록 작업 : 단일 연결 목록 및 이중 연결 목록
주로 몇 가지 요점은 다음에 대해 이야기합니다.
1. 링크 된 목록 소개
2. 링크 된 목록의 구현을위한 원칙과 필수품
3. 단일 가닥 예
4. 이중 연결 예
1. 링크 된 목록 소개
링크 된 목록은 비교적 일반적인 데이터 구조입니다. 링크 된 목록은 저장하기에 더 복잡하지만 쿼리 할 때 더 편리합니다. 그에 따라 여러 컴퓨터 언어로 사용됩니다. 링크 된 목록에는 여러 범주가 있습니다. 기사는 단일 연결 목록 및 이중 연결 목록에 대해 분석됩니다. 링크 된 목록의 데이터는 체인으로 함께 연결되는 것과 같습니다. 데이터에 쉽게 액세스 할 수 있습니다.
2. 링크 된 목록의 구현을위한 원칙과 필수품
단일 연결 목록과 이중 연결 목록 만 여기에서 분석됩니다. 링크 된 목록의 구현 프로세스는 약간 복잡하지만 많은 이점을 가져올 것입니다. 예를 들어, 온라인 쇼핑이 도착하면 상인은 일반적으로 상자에 상품을 포장하고 상자에 주소 정보를 작성합니다. Express Company는 상자의 정보를 통해 구매자를 찾을 수 있으며 상품은 손상되지 않습니다. 상자를 보호하지 않으면 제품이 손상 될 수 있습니다. 링크 된 목록은 제품 정보를 보호 할뿐만 아니라 물류 정보를 작성하는 주소 정보가있는 상자와 같습니다. 링크 된 목록에는 "기관차"와 유사한 헤드 노드가 있습니다. 해당 헤드 노드가 발견되는 한 링크 된 목록에서 작동 할 수 있습니다. 이 분석에서 헤드 노드는 데이터 헤더 역할을하며 유효한 데이터를 저장하지 않습니다.
단일 링크 된 목록의 구현 원리는 그림에 나와 있습니다.
이중 연결 목록 구현 원리 :
3. 단일 가닥 예
icommoperate <T> 인터페이스 작동 클래스 :
package linklisttest; import java.util.map; public interface icommoperate <t> {public boolean insertnode (t node); 공개 부울 삽입물 (int pos, t node); public boolean deleteNode (int pos, map <string, object> map); public void printlink ();}단일 링크 목록 노드 :
패키지 linkListTest; // 단일 연결 테이블 노드 공개 클래스 스노 드 {private String data; 비공개 스노 드 옆도; public snode () {} public snode (문자열 데이터) {this.data = data; this.nextNode = new snode (); } public String getData () {return data; } public void setData (문자열 데이터) {this.data = data; } public snode getNextNode () {return nextNode; } public void setNextNode (Snode NextNode) {this.nextNode = NextNode; } @override public String toString () {return "snode [data =" + data + "]; }}단일 링크 작동 클래스 :
패키지 linklisttest; import java.util.hashmap; import java.util.map; public class singlelinklist는 icommoperate <snode> {private snode head = new snode ( "head"); // 공개 헤더 포인터, 선언 후 변경되지 않은 개인 int size = 0; public int getsize () {return this.size; } / * * 링크 된 목록을 삽입하고 매번 끝까지 삽입 * / @override public boolean insertnode (snode node) {boolean flag = false; snode current = this.head; if (this.size == 0) {// 링크 된 링크 목록 this.head.setNextNode (노드); node.setnextNode (null); } else {// 링크 된 목록의 // while (current.getNextNode ()! = null) {current = current.getNextNode (); } current.setNextNode (노드); node.setnextNode (null); } this.size ++; flag = true; 리턴 플래그; } / * * 링크 된 목록에 1에서 시작하여 POS의 지정된 위치를 삽입 한 다음 POS가 크기보다 크면 링크 된 목록의 끝을 삽입 * / @override public boolean insertposnode (int pos, snode node) {boolean flag = true; snode current = this.head.getnextNode (); if (this.size == 0) {// 빈 연결된 목록 this.head.setNextNode (노드); node.setnextNode (null); this.size ++; } else if (this.size <pos) {// pos 위치는 링크 된 목록의 길이, insertNode (노드)보다 큽니다. } else if (pos> 0 && pos <= this.size) {// 링크 된 목록의 // 노드. int int find = 0; snode prenode = this.head; // 전면 노드 스 네드 currentNode = current; // 현재 노드 while (find <pos-1 && currentNode.getNextNode ()! = null) {prenode = current; // 전면 노드가 뒤로 이동합니다 currentNode = currentNode.getNextNode (); // 현재 노드가 뒤로 이동합니다. 찾기 ++; } // system.out.println (prenode); // system.out.println (currentNode); // 2. 노드 prenode.setnextNode (노드) 삽입; node.setNextNode (currentNode); this.size ++; System.out.println ( "노드가 링크 된 목록에 삽입되었습니다"); } else {system.out.println ( "위치 정보 오류"); flag = false; } 반환 플래그; } / * * 링크 된 목록의 노드 PO를 지정하고 해당 노드를 삭제합니다. 방법 : 전면 및 후면 노드를 찾아 삭제하고 삭제하십시오. 1 * */ @override public boolean deleteNode (int pos) {boolean flag = false; snode current = this.head.getnextNode (); if (pos <= 0 || pos> this.size || current == null) {system.out.println ( "링크 된 목록의 위치 정보 오류 또는 정보가 없음"); } else {// 1. int find = 0을 삭제하려면 전면 및 후면 노드를 찾으십시오. snode prenode = this.head; // 프론트 노드 스 네드 NextNode = current.getNextNode (); // back node while (find <pos-1 && nextnode.getnextNode ()! = null) {prenode = current; // 프론트 노드가 다시 이동합니다. nextNode = nextNode.getNextNode (); // 뒤쪽 노드가 뒤로 이동합니다. 찾기 ++; } // system.out.println (prenode); // system.out.println (NextNode); // 2. 노드 prenode.setNextNode (NextNode)를 삭제합니다. System.gc (); this.size--; flag = true; } 반환 플래그; } / * * 링크 된 목록의 노드 PO를 지정하고 해당 노드를 수정합니다. 1 * */ @override public boolean updatenode (int pos, map <string, object> map) {boolean flag = false; 노드 노드 = getNode (POS, MAP); // (node! = null) {문자열 data = (string) map.get ( "data"); node.setData (데이터); flag = true; } 반환 플래그; } / * * 1 * * / @override public snode getNode (int pos, map <string, object> map)부터 시작하여 지정된 링크 된 목록의 노드 PO를 찾으십시오. if (pos <= 0 || pos> this.size || current == null) {system.out.println ( "위치 정보가 잘못되었거나 링크 된 목록이 존재하지 않습니다"); 널 리턴; } int find = 0; while (find <pos-1 && current! = null) {current = current.getNextNode (); 찾기 ++; } 현재 반환; } / * * 인쇄 링크 된 목록 * / @override public void printlink () {int length = this.size; if (length == 0) {System.out.println ( "링크 된 목록은 비어 있습니다!"); 반품 ; } snode current = this.head.getNextNode (); int find = 0; System.out.println ( "총 노드 수 :" + 길이 + "ones"); while (current! = null) {system.out.println ( "th" + (++ find) + "노드 :" + current); current = current.getNextNode (); }} public static void main (string [] args) {Singlelinklist sll = new Singlelinklist (); 노드 노드 1 = 새로운 스 네드 ( "node1"); Snode node2 = 새로운 스 니드 ( "Node2"); 노드 노드 3 = 새로운 스 네드 ( "Node3"); 노드 Node4 = 새로운 스 네드 ( "Node4"); 노드 Node5 = 새로운 스 네드 ( "Node5"); Snode Node6 = 새 스 니드 ( "지정된 위치 삽입"); sll.insertposnode (sll.getsize ()+1, node1); sll.insertposnode (sll.getsize ()+1, node2); sll.insertposnode (sll.getsize ()+1, node3); sll.insertposnode (sll.getsize ()+1, node4); sll.insertposnode (sll.getsize ()+1, node5); // sll.insertnode (node1); // sll.insertnode (node2); // sll.insertnode (node3); // sll.insertnode (node4); // sll.insertnode (node5); System.out.println ( "*********************************"); sll.printlink (); system.out.println ( "*************************************************************************************************************************************************************************************************************************************************************************. int pos = 2; System.out.println ( "링크 된 목록의"+pos+"위치 데이터 가져 오기 :"+sll.getNode (pos, null)); System.out.println ( "****************************** 링크 된 목록의 지정된 위치에 노드 삽입 **************************"); int pos1 = 2; System.out.println("Insert data into "+pos1+"" nodes: "); sll.insertPosNode(pos1, node6); sll.printLink(); System.out.println("************************************Delete the specified location node of the linked list*************************************"); int pos2 = 2; "삭제"+pos2+"노드 : sll.printlink (); POS3 = 2; "+pos3+"노드를 수정합니다.4. 이중 연결 예
icommoperate <T> 인터페이스 작동 클래스 :
package linklisttest; import java.util.map; public interface icommoperate <t> {public boolean insertnode (t node); 공개 부울 삽입물 (int pos, t node); public boolean deleteNode (int pos, map <string, object> map); public void printlink ();}이중 연결 목록 노드 :
패키지 linkListTest; // 이중 연속 테이블 노드 public class dnode {private dnode priornode; 개인 문자열 데이터; 개인 DNODE NextNode; public dnode () {} public dnode (문자열 데이터) {this.priornode = new dnode (); this.data = 데이터; this.nextNode = new dnode (); } public dnode getPriorNode () {return PriorNode; } public void setPriorNode (dnode priornode) {this.priornode = priornode; } public String getData () {return data; } public void setData (문자열 데이터) {this.data = data; } public dnode getNextNode () {return nextNode; } public void setNextNode (dnode nextNode) {this.nextNode = nextNode; } @override public String toString () {return "dnode [data =" + data + "]; }}이중 연결 목록 구현 클래스 :
package linklisttest; import java.util.hashmap; import java.util.map; public class doublelinklist는 icommoperate <dnode> {private dnode head = new dnode ( "head"); 개인 int 크기 = 0; public int getsize () {return this.size; } / * * 링크 된 목록을 삽입하고 매번 끝까지 삽입 * / @override public boolean insertNode (dnode node) {boolean flag = false; dnode current = this.head; if (this.size == 0) {// 링크 된 링크 목록 this.head.setNextNode (노드); node.setPriorNode (this.head); node.setnextNode (null); } else {// 링크 된 목록의 // while (current.getNextNode ()! = null) {current = current.getNextNode (); } current.setNextNode (노드); node.setnextNode (null); node.setPriorNode (현재); } this.size ++; flag = true; 리턴 플래그; } / * * 링크 된 목록에 POS의 지정된 위치를 1부터 시작하여 크기보다 크고 링크 된 목록의 끝을 삽입 * / @override public boolean insertposnode (int pos, dnode node) {boolean flag = true; dnode current = this.head.getnextNode (); if (this.size == 0) {// 링크 된 목록이 비어 있습니다. node.setnextNode (null); node.setPriorNode (this.head); this.size ++; } else if (pos> this.size) {// pos 위치는 링크 된 목록의 길이보다 큽니다. end insertNode (노드)를 삽입합니다. } else if (pos> 0 && pos <= this.size) {// 링크 된 목록의 // 노드 삽입 할 POS 노드를 찾으십시오. POS 노드 전류 위치 int find = 0; while (find <pos-1 && current.getnextNode ()! = null) {current = current.getNextNode (); 찾기 ++; } // 2. if (current.getNextNode () == null) {// 꼬리 노드 노드 .setPriorNode (current); node.setnextNode (null); current.setNextNode (노드); } else if (current.getNextNode ()! = null) {// 중간 노드 노드 .setPriorNode (current.getPriorNode ()); node.setnextNode (현재); current.getPriorNode (). setNextNode (노드); current.setPriorNode (노드); } this.size ++; } else {system.out.println ( "위치 정보 오류"); flag = false; } 반환 플래그; } / * * 링크 된 목록의 노드 PO를 지정하고 1 * * / @override public boolean deleteNode (int pos)부터 시작하여 해당 노드를 삭제하십시오. {부울 플래그 = false; dnode current = this.head.getnextNode (); if (pos <= 0 || pos> this.size || current == null) {system.out.println ( "위치 정보가 잘못되었거나 링크 된 목록이 존재하지 않습니다"); } else {// 1. 삭제할 위치를 찾으십시오. POS 노드 int find = 0; while (find <pos-1 && current.getnextNode ()! = null) {current = current.getNextNode (); 찾기 ++; } // 2. if (current.getNextNode () == null) {// 꼬리 노드 current.getPriorNode (). setNextNode (null); } else if (current.getNextNode ()! = null) {// 중간 노드 전류 .getPriorNode (). setNextNode (current.getNextNode ()); current.getNextNode (). setPriorNode (current.getPriorNode ()); } system.gc (); this.size--; flag = true; } 반환 플래그; } / * * 링크 된 목록의 노드 PO를 지정하고 해당 노드를 수정합니다. 1 * */ @override public boolean updatenode (int pos, map <string, object> map)에서 시작하십시오. {boolean flag = false; dnode 노드 = getNode (pos, map); if (node! = null) {문자열 data = (string) map.get ( "data"); node.setData (데이터); flag = true; } 반환 플래그; } / * * 지정된 링크 된 목록의 노드 PO를 찾아서 1 * * / @override public dnode getNode (int pos, map <string, object> map) {dnode current = this.head.getnextNode (); if (pos <= 0 || pos> this.size || current == null) {system.out.println ( "위치 정보가 잘못되었거나 링크 된 목록이 존재하지 않습니다"); 널 리턴; } int find = 0; while (find <pos-1 && current! = null) {current = current.getNextNode (); 찾기 ++; } 현재 반환; } / * * 인쇄 링크 된 목록 * / @override public void printlink () {int length = this.size; if (length == 0) {System.out.println ( "링크 된 목록은 비어 있습니다!"); 반품 ; } dnode current = this.head.getNextNode (); int find = 0; System.out.println ( "총 노드 수 :" + 길이 + "ones"); while (current! = null) {system.out.println ( "th" + (++ find) + "노드 :" + current); current = current.getNextNode (); }} public static void main (string [] args) {doublelinklist dll = new doublelinklist (); dnode node1 = new dnode ( "node1"); dnode node2 = new dnode ( "node2"); dnode node3 = new dnode ( "node3"); dnode node4 = new dnode ( "node4"); dnode node5 = new dnode ( "node5"); dnode node6 = new dnode ( "지정된 위치 삽입"); dll.insertposnode (10, node1); dll.insertposnode (10, node2); dll.insertposnode (10, node3); dll.insertposnode (10, node4); dll.insertposnode (10, node5); // dll.insertnode (node1); // dll.insertnode (node2); // dll.insertnode (node3); // dll.insertnode (node4); // dll.insertnode (node5); System.out.println ( "*********************************"); dll.printlink (); system.out.println ( "******************************************************************************************************************************************************************************************************************************************* int pos = 2; System.out.println ( "링크 된 목록의"+pos+"위치 데이터 :"+dll.getNode (pos, null)); System.out.println ( "****************************** 링크 된 목록의 지정된 위치에 노드 삽입 **************************"); int pos1 = 2; System.out.println ( ""+pos1+"노드에 데이터를 삽입 :"); dll.insertposnode (pos1, node6); dll.printlink (); System.out.println ( "***************************** 링크 된 목록에 지정된 노드 삭제 ***************************"); int pos2 = 7; System.out.println ( "삭제"+pos2+"노드 :"); DLL.DELETENODE (POS2); dll.printlink (); System.out.println ( "****************************** 링크 된 목록에 지정된 노드를 수정하십시오 *****************************"); int pos3 = 2; System.out.println ( ""+pos3+"노드를 수정 :"); map <string, object> map = new Hashmap <> (); map.put ( "데이터", "이것은 테스트입니다"); DLL.UPDATENODE (POS3, MAP); dll.printlink (); }}읽어 주셔서 감사합니다. 도움이되기를 바랍니다. 이 사이트를 지원 해주셔서 감사합니다!