자바의 LinkedList
데이터 구조란 무엇입니까?
데이터 구조는 데이터를 효과적으로 저장, 구성/관리 및 검색하는 방법입니다. 데이터 구조는 거의 모든 프로그램에서 사용되며 소프트웨어 엔지니어링에서 배우고 이해하는 데 매우 중요합니다.
LinkedList란 무엇입니까?
LinkedList는 종종 노드라고 하는 동일한 유형의 요소 시퀀스를 나타내는 선형(O(n)) 데이터 구조입니다. 각 노드에는 인접 및/또는 이전 노드를 가리키는 데이터 및 포인터가 있습니다. 목록의 첫 번째 노드를 헤드라고 하며 목록의 마지막 노드 포인터는 null 또는 헤드를 가리킵니다(Circular LinkedList). 이 데이터 구조는 동적이므로 LinkedList에서 삽입 및 삭제된 요소 수에 따라 확장 및 축소될 수 있습니다.
LinkedList를 순회하려면 처음(헤드)에서 시작하여 원하는 노드에 도달할 때까지 각 항목을 통과해야 합니다. LinkedList는 임의 액세스를 허용하지 않습니다.
Java에서 LinkedList는 Serializable, Cloneable, Iterable, Collection, Deque, List, Queue 인터페이스를 구현합니다. 이는 LinkedList 데이터 구조의 작업 및 프로그램 내에서의 사용에 있어 유연성을 제공하기 때문에 중요합니다.
아래에서는 LinkedList(Singly) 및 일부 작업을 빌드하는 방법을 보여줍니다. 그러나 구현은 문서의 구현만큼 구체적이지 않습니다. documentation 을 보려면 여기를 클릭하십시오.
구현
단일 연결 목록
Singly LinkedList에는 다음 노드의 메모리 주소를 가리키는 각 노드에 대한 포인터가 하나만 있습니다. (아래 참조)
/**
* @author brittcodes
*
*/
public class SinglyLinkedList {
Node head;
static class Node {
private int data;
private Node next;
public Node(int data) {
this.data = data;
next = null;
}
public String toString() {
return "Node [ data=" + data + ", next=" + next + " ]";
}
}
/**
* Inserts Node at the end of the list
*
* @param data, primitive data type int
*/
public void add(int data) {
//create a new node, put data in it
Node newNode = new Node(data);
//if head is null, set new node as head
if(head == null) {
head = newNode;
return;
}
//set new node next to null
newNode.next = null;
//find the node with next as null, and set that node to the new node
Node last = head;
while(last.next != null) {
last = last.next;
}
last.next = newNode;
}
/**
* Inserts a new Node after a given previous Node
*
*
* @param data, primitive data type int
*/
public void insertAfter(Node node, int data) {
//create a new node, put data in it
Node newNode = new Node(data);
//set newNode's next to node's next
newNode.next = node.next;
//set node's next to new Node
node.next = newNode;
//if list is empty, set newNode to head
if(head == null) {
newNode = head;
}
}
/**
* Inserts a new Node at beginning of list
*
*
* @param data, primitive data type int
*/
public void insertToFront(int data) {
// create a node, put data in it
Node newNode = new Node(data);
// set new node's pointer to the head
newNode.next = head;
// if list is empty, set newNode to head
if (head == null) {
newNode = head;
}
// make newNode the head
head = newNode;
}
/**
* Prints out the LinkedList
*
*/
public void printList() {
// traverse the nodes and print
Node n = head;
while (n != null) {
System.out.print(n.data + " ");
n = n.next;
}
System.out.println();
}
public static void main(String[] args) {
SinglyLinkedList list = new SinglyLinkedList();
list.head = new Node(1);
Node second = new Node(2);
Node third = new Node(3);
list.head.next = second;
second.next = third;
list.insertToFront(6);
list.printList();
list.insertAfter(third, 8);
list.printList();
list.add(23);
list.printList();
}
}
이중 연결 목록
Doubly LinkedList에는 각 노드에 대한 두 개의 포인터가 있습니다. 이전 노드의 메모리 주소를 가리키는 포인터 하나와 다음/인접 노드의 메모리 주소를 가리키는 다른 포인터.
/**
* @author brittcodes
*
*/
public class DoublyLinkedList {
Node head;
static class Node {
int data;
Node next;
Node previous;
public Node(int data) {
this.data = data;
next = null;
previous = null;
}
public String toString() {
return "Node [ data=" + data + ", next=" + next + " ]";
}
}
/**
* Prints list forwards and backwards
*
* @param n, represents Node
*/
public void printList(Node n) {
Node last = null;
// Prints forward
System.out.println("\nTraverse forward");
while (n != null) {
System.out.print(n.data + " ");
last = n;
n = n.next;
}
// Prints backwards
System.out.println("\nTraverse backward");
while (last != null) {
System.out.print(last.data + " ");
last = last.previous;
}
}
/**
* Inserts Node to the beginning of list
*
* @param data, primitive data type int
*/
public void insertToFront(int data) {
// create a new Node
// put in the data
Node newNode = new Node(data);
// Make next of new node as head and previous as NULL
newNode.next = head;
newNode.previous = null;
// change previous of head node to new node
if (head != null) {
head.previous = newNode;
}
// move the head to point to the new node
head = newNode;
}
/**
* Inserts element after specified prevNode with data at the end of the list
*
* @param prevNode
* @param data
*/
public void insertAfter(Node prevNode, int data) {
if (prevNode == null) {
System.out.println("The given previous node cannot be NULL ");
return;
}
Node newNode = new Node(data);
newNode.next = prevNode.next;
prevNode.next = newNode;
newNode.previous = prevNode;
if (newNode.next != null) {
newNode.next.previous = newNode;
}
}
public void insertBefore(Node node, int data) {
Node newNode = new Node(data);
if ((head == null) && (node == null)) {
head = newNode;
}
newNode.previous = node.previous;
node.previous = newNode;
newNode.next = node;
if (newNode.previous != null) {
newNode.previous.next = newNode;
}
}
/**
* Inserts element at the end of the list
*
* @param data
*/
public void insertAtEnd(int data) {
// create a new Node
// put in the data
// make new Node next point to null
// traverse list until at last node
// make new Node previous point to last Node
// make last node next point to new Node
Node newNode = new Node(data);
Node last = head;
newNode.next = null;
if (head == null) {
head = newNode;
newNode.previous = null;
return;
}
while (last.next != null) {
last = last.next;
}
newNode.previous = last;
last.next = newNode;
}
public static void main(String[] args) {
DoublyLinkedList doubly = new DoublyLinkedList();
doubly.head = new Node(4);
Node second = new Node(5);
Node third = new Node(6);
doubly.head.next = second;
second.next = third;
third.previous = second;
second.previous = doubly.head;
doubly.printList(doubly.head);
doubly.insertAfter(doubly.head, 10);
doubly.printList(doubly.head);
doubly.insertAtEnd(25);
doubly.printList(doubly.head);
doubly.insertBefore(second, 101);
doubly.printList(doubly.head);
}
}
Reference
이 문제에 관하여(자바의 LinkedList), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/brittcodes/test-fh5텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)