>  기사  >  Java  >  Java 단일 연결 리스트의 기본 연산 구현

Java 단일 연결 리스트의 기본 연산 구현

高洛峰
高洛峰원래의
2017-01-24 15:58:131668검색

최근 친구와 Java에 관해 토론할 때 연결 목록에 대한 질문을 받았습니다. 솔직히 말해서 저는 프로그래밍을 배운 거의 1년 동안 배운 것이 거의 없습니다. Java와 C#을 언어로 배웠고, 웹에 관한 Html+css+javascript에 대해서도 조금 배웠습니다. 선호하는 편이라 WinForm을 배울 때 좀 더 진지하게 공부하고, 데이터베이스 운용에 대한 연구도 좀 하고 있어요. 하지만 저는 링크드 리스트를 공부하거나 연구한 적이 없습니다. 게다가 최근에는 WPF를 읽고 있는데, 그 과정도 상대적으로 빡빡한 JSP에 이르렀습니다.

그래도 단방향 연결 리스트를 살펴보느라 1박 반나절이 걸렸습니다. 그리고 Java를 사용하여 예제를 작성해 보았습니다. 링크드리스트에 노출된 적이 없는 친구들도 참고자료로 활용하시면 더욱 귀중한 의견을 주실 수 있기를 바랍니다.

먼저 연결리스트가 무엇인지부터 설명하겠습니다. 내가 아는 한, 연결된 목록은 배열과 동일한 수준의 데이터 구조입니다. 예를 들어, Java에서 사용하는 ArrayList는 배열을 기반으로 구현됩니다. LinkedList의 구현 원리는 연결 리스트입니다. 선생님께서는 연결리스트가 루프 순회를 수행할 때 효율적이지 않지만 삽입 및 삭제에는 분명한 이점이 있다고 말씀하셨습니다. 그렇다면 그는 10년 이상의 프로그래밍 경험을 가지고 있다고 나는 믿습니다. 하지만 그가 이중 연결 목록에 대해 이야기하고 있는지는 모르겠습니다. 여기서는 단방향 연결 목록만 이해하고 있습니다.

연결리스트(이 글에서 언급하는 연결리스트는 모두 단방향 연결리스트이며, 이하 단방향 연결리스트라고 함)는 실제로 노드(Node)로 구성되며, 연결리스트는 무한정의 노드 수. 외부에 노출된 헤드 노드(Head)는 단 하나뿐입니다. 연결 리스트에 대한 모든 작업은 해당 헤드 노드를 통해 직접 또는 간접적으로 수행됩니다.

노드는 저장해야 하는 객체와 다음 노드에 대한 참조로 구성됩니다. 즉, 노드에는 저장된 개체와 다음 노드에 대한 참조라는 두 가지 구성원이 있습니다.

이렇게 이해하지 못하실 수도 있으니 사진을 올려드리니 이해하시기가 더 쉬우실 것 같습니다.

Java 단일 연결 리스트의 기본 연산 구현

Java 단일 연결 리스트의 기본 연산을 구현하는 키 코드는 다음과 같습니다.

package com.tyxh.link; 
//节点类 
public class Node { 
protected Node next; //指针域 
protected int data;//数据域 
public Node( int data) { 
this. data = data; 
} 
//显示此节点 
public void display() { 
System. out.print( data + " "); 
} 
} 
package com.tyxh.link; 
//单链表 
public class LinkList { 
public Node first; // 定义一个头结点 
private int pos = 0;// 节点的位置 
public LinkList() { 
this. first = null; 
} 
// 插入一个头节点 
public void addFirstNode( int data) { 
Node node = new Node(data); 
node. next = first; 
first = node; 
} 
// 删除一个头结点,并返回头结点 
public Node deleteFirstNode() { 
Node tempNode = first; 
first = tempNode. next; 
return tempNode; 
} 
// 在任意位置插入节点 在index的后面插入 
public void add(int index, int data) { 
Node node = new Node(data); 
Node current = first; 
Node previous = first; 
while ( pos != index) { 
previous = current; 
current = current. next; 
pos++; 
} 
node. next = current; 
previous. next = node; 
pos = 0; 
} 
// 删除任意位置的节点 
public Node deleteByPos( int index) { 
Node current = first; 
Node previous = first; 
while ( pos != index) { 
pos++; 
previous = current; 
current = current. next; 
} 
if(current == first) { 
first = first. next; 
} else { 
pos = 0; 
previous. next = current. next; 
} 
return current; 
} 
// 根据节点的data删除节点(仅仅删除第一个) 
public Node deleteByData( int data) { 
Node current = first; 
Node previous = first; //记住上一个节点 
while (current. data != data) { 
if (current. next == null) { 
return null; 
} 
previous = current; 
current = current. next; 
} 
if(current == first) { 
first = first. next; 
} else { 
previous. next = current. next; 
} 
return current; 
} 
// 显示出所有的节点信息 
public void displayAllNodes() { 
Node current = first; 
while (current != null) { 
current.display(); 
current = current. next; 
} 
System. out.println(); 
} 
// 根据位置查找节点信息 
public Node findByPos( int index) { 
Node current = first; 
if ( pos != index) { 
current = current. next; 
pos++; 
} 
return current; 
} 
// 根据数据查找节点信息 
public Node findByData( int data) { 
Node current = first; 
while (current. data != data) { 
if (current. next == null) 
return null; 
current = current. next; 
} 
return current; 
} 
} 
package com.tyxh.link; 
//测试类 
public class TestLinkList { 
public static void main(String[] args) { 
LinkList linkList = new LinkList(); 
linkList.addFirstNode(20); 
linkList.addFirstNode(21); 
linkList.addFirstNode(19); 
//19,21,20 
linkList.add(1, 22); //19,22,21,20 
linkList.add(2, 23); //19,22,23,21,20 
linkList.add(3, 99); //19,22,23,99,21,20 
linkList.displayAllNodes(); 
// Node node = linkList.deleteFirstNode(); 
// System.out.println("node : " + node.data); 
// linkList.displayAllNodes(); 
// node = linkList.deleteByPos(2); 
// System.out.println("node : " + node.data); 
// linkList.displayAllNodes(); 
// linkList.deleteFirstNode(); 
Node node = linkList.deleteByData(19); 
// Node node = linkList.deleteByPos(0); 
System. out.println( "node : " + node. data); 
linkList.displayAllNodes(); 
Node node1 = linkList.findByPos(0); 
System. out.println( "node1: " + node1. data); 
Node node2 = linkList.findByData(22); 
System. out.println( "node2: " + node2. data); 
} 
}

위는 Java 단일 연결 리스트의 기본 연산입니다. 편집자가 소개한 내용입니다. 모든 분들께 도움이 되기를 바랍니다. 궁금한 점이 있으시면 메시지를 남겨주시면 편집자가 시간 맞춰 답변해 드리겠습니다. 또한 PHP 중국어 웹사이트를 지원해 주신 모든 분들께 감사드립니다!

Java 단일 연결 리스트의 기본 연산 구현과 관련된 더 많은 기사를 보려면 PHP 중국어 웹사이트를 주목하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.