Java의 간단한 LinkedList 구현 방법
                                            
 7726 단어  javaLinkedList
                    
추상적인 데이터 구조인 선형표에 대해 말하자면 선형표는 두 가지로 나뉘는데 하나는 순서 저장 구조의 순서표이고, 다른 하나는 지침을 통해 그 논리적 위치를 묘사하는 체인표이다.
구체적인 Java 구현:
ArrayList의 경우 삽입과 삭제의 시간 복잡도가 높지만 지정된 위치의 요소를 찾는 작업은 수조를 통해 이 아래 표시에 대응하는 요소를 직접 얻을 수 있기 때문에 매우 빠르다.오히려 LinkedList의 경우 지정된 위치의 요소를 직접 반환할 수 없으며 하나의 질의가 필요합니다. 그 시간의 복잡도는 **O(n)**입니다.
Java의 ArrayList 클래식 엔티티 클래스 구현 방법과 마찬가지로 실현의 목적은 주로 정부의 실현 원리와 기교를 연습하고 파악하는 데 있기 때문에 다른 유형과 협조해야 하는 방법과 기능이 많기 때문에 여기서 실현되지 않는다. 예를 들어iterator 등이다.
따라서 LinkedList를 구현하는 방법은 다음과 같습니다.
add 방법
get 방법
indexOf 방법
제거 방법
Array List를 구현하는 이름과 마찬가지로 Simple Linked List입니다.소스 주소, 환영스타,fork
양방향 체인 테이블 구축
구축된 코드는 다음과 같습니다.
 private static class Node<E>{
 E item;
 Node<E> next;
 Node<E> prev;
 public Node(E item, Node<E> next, Node<E> prev) {
 this.item = item;
 this.next = next;
 this.prev = prev;
 }
 } 
LinkedList 구현에는 다음 세 개의 구성원 변수가 필요합니다.
 private int size;
 private Node<E> first;
 private Node<E> last;
여기서 실현된add방법은 간단한add(E)와add(int index, E) 두 가지 방법입니다.addAll()은 다른 집합을 LinkedList로 전환하는 방법으로 잠시 후에 실현합니다.
add 방법은 두 가지 재부팅 방법으로 각각 다른 추가 방식에 대응한다.먼저 add(E) 방법의 실현을 말해라.
 public boolean add(E element) {
 addAtLast(element);
 return true;
 }
 private void addAtLast(E element) {
 Node<E> l = last;
 Node<E> node = new Node<E>(element, null, l);
 last = node;
 if (l == null) {
 first = node;
 } else {
 l.next = node;
 }
 size++;
 }상술한 조작을 통해 알 수 있듯이 삽입된 조작은 시간을 매우 절약하고 Array List보다 용량을 확대하고 원소를 이동하는 것이 매우 빠르다.
add의 두 번째 재부팅 방법add(int index, E e), 코드 구현을 먼저 보십시오.
 public void add(int index, E element) {
 checkRangeForAdd(index);
 if (index == size) {
 addAtLast(element);
 } else {
 Node<E> l = node(index);
 addBeforeNode(element, l);
 }
 }index에 대응하는 Node 요소를 가져오는 방법은 다음과 같습니다.
 private Node<E> node(int index) {
 if (index < (size << 1)) {
 Node<E> cursor = first;
 for (int i = 0; i < index; i++) {
 cursor = cursor.next;
 }
 return cursor;
 } else {
 Node<E> cursor = last;
 for (int i = size - 1; i > index; i--) {
 cursor = cursor.prev;
 }
 return cursor;
 }
 }지정된 요소 앞에 새 노드의 addBeforeNode를 삽입하는 방법은 다음과 같습니다.
 private void addBeforeNode(E element, Node<E> specifiedNode) {
 Node<E> preNode = specifiedNode.prev;
 Node<E> newNode = new Node<>(element, specifiedNode, preNode);
 if (preNode == null) {
 first = newNode;
 } else {
 preNode.next = newNode;
 }
 specifiedNode.prev = newNode;
 size++;
 }이로써add방법 하나로 완성되었습니다.
get 방법
get 방법은 상술한 node 방법이 생긴 후에 매우 간단하다.코드는 다음과 같습니다.
 public E get(int index) {
 checkRange(index);
 return node(index).item;
 }
 private void checkRange(int index) {
 if (index >= size || index < 0) {
 throw new IndexOutOfBoundsException(" index ");
 }
 }indexOf(Object o)는 지정된 요소의 아래 첨자를 가져오는 데 사용됩니다.
 public int indexOf(Object element) {
 Node<E> cursor = first;
 int count = 0;
 while (cursor != null) {
 if (element != null) {
 if (element.equals(cursor.item)) {
  return count;
 }
 }else{
 if (cursor.item == null) {
  return count;
 }
 }
 count ++;
 cursor = cursor.next;
 }
 return -1;
 }
제거 방법
remove 방법은add 방법과 마찬가지로 두 가지 재부팅 방법이 있습니다. remove(Objecto)와remove(int index)
간단한 remove(int index) 방법을 먼저 보십시오. 코드는 다음과 같습니다.
 public E remove(int index) {
 checkRange(index);
 return deleteLink(index);
 }
 private E deleteLink(int index) {
 Node<E> l = node(index);
 E item = l.item;
 Node<E> prevNode = l.prev;
 Node<E> nextNode = l.next;
 if (prevNode == null) {
 first = nextNode;
 }else{
 prevNode.next = nextNode;
 l.next = null;
 }
 if (nextNode == null) {
 last = prevNode;
 }else{
 nextNode.prev = prevNode;
 l.prev = null;
 }
 size--;
 l.item = null;
 return item;
 }
remove의 또 다른 재부팅 방법인 remove(Object o)는 index Of와 delete Link 방법을 실현한 후에 매우 간단하다.
 public boolean remove(Object o) {
 int index = indexOf(o);
 if (index < 0){
 return false;
 }
 deleteLink(index);
 return true;
 }총결산
이로써 하나의 기능이 간단한 LinkedList가 완성되었고 모든 코드는 볼 수 있다소스 주소.
이상은 본문의 전체 내용입니다. 본고의 내용이 여러분의 학습이나 업무에 일정한 도움을 줄 수 있는 동시에 저희를 많이 지지해 주시기 바랍니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
38. Java의 Leetcode 솔루션텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.