데이터 구조 (2) - 링크
링크
링크 는 데이터 집합 을 저장 하 는 데이터 구조 로 그 는 가장 간단 한 동적 데이터 구조 이다.지난 편 에서 우 리 는 분명히 간단 한 동적 배열 을 실현 했다.이것 은 단지 사용 자 를 대상 으로 하 는 것 일 뿐 입 니 다. 사실은 배열 의 밑바닥 은 정적 인 배열 입 니 다. 우 리 는 간단하게 복사 한 그 당시 에 용량 의 증 가 를 실 현 했 을 뿐 입 니 다. 하지만!!링크 는 진정한 의미 의 동적 데이터 구조 이다.
링크 의 장점
자신의 링크 클래스 를 실현 하 다.
마찬가지 로 우 리 는 이전 배열 의 소개 에서 우 리 는 자신의 링크 를 완성 하고 가장 간단 한 추가 삭제 기능 을 지원 합 니 다.
public class LinkedList {
private class Node{
private E e;
private Node next;//
public Node(E e,Node next){
this.e = e;
this.next = next;
}
public Node(E e){
this(e,null);
}
public Node(){
this(null,null);
}
@Override
public String toString() {
return e.toString();
}
}
private Node dummyHead;//
private int size;//
public LinkedList(){
dummyHead = new Node();
size = 0;
}
//
public int getSize(){
return size;
}
//
public boolean isEmpty(){
return size == 0;
}
/**
*
* @param index
* @param e
*/
public void add(int index,E e){
if(index < 0 || index > size){
throw new IllegalArgumentException("Add failed. Illegal index.");
}
// ,
Node prve = dummyHead;
for (int i = 0; i < index; i++) {
//
prve = prve.next;
}
prve.next = new Node(e,prve.next);
size++;
}
/**
*
*/
public void addFirst(E e){
// Node node = new Node(e);
// node.next = dummyHead;
// dummyHead = node;
dummyHead = new Node(e,dummyHead);
}
/**
*
* @param e
*/
public void addLast(E e){
this.add(size,e);
}
public E get(int index){
if(index < 0 || index > size){
throw new IllegalArgumentException("Add failed. Illegal index.");
}
Node cur = dummyHead.next;
for (int i = 0; i < size; i++) {
cur = cur.next;
}
return cur.e;
}
//
public E getFirst(){
//
return dummyHead.next.e;
}
//
public E getLast(){
return this.get(size -1);
}
//
public void set(int index ,E e){
// get , ,
if(index < 0 || index > size){
throw new IllegalArgumentException("Add failed. Illegal index.");
}
Node cur = dummyHead.next;
for (int i = 0; i < size; i++) {
cur = cur.next;
}
cur.e = e;
}
// e
public boolean contains(E e){
// ,
Node cur = dummyHead.next;
while (cur != null){
if(cur.e.equals(e)){
return true;
}
cur = cur.next;
}
return false;
}
//
public void remove(int index){
if(index < 0 || index > size){
throw new IllegalArgumentException("Add failed. Illegal index.");
}
// , , ,
Node prev = dummyHead;
for (int i = 0; i < index; i++) {
prev = prev.next ;
}
//
Node retNode = prev.next;
//
prev.next = retNode.next;
//
retNode.next = null;
size --;
}
//
public void removeFirst(){
//
dummyHead.next = dummyHead.next.next;
size--;
}
// ,
public void removeLast() {
remove(size - 1);
}
@Override
public String toString() {
StringBuilder res = new StringBuilder();
Node cur = dummyHead.next;
while (cur != null) {
res.append(cur + "->");
cur = cur.next;
}
res.append("NULL");
return res.toString();
}
}
링크 에서 가상 헤드 노드 의 역할
첫 번 째 요소 (진 두 노드) 는 앞 순서 노드 가 없 기 때문이다.우리 가 조작 을 할 때 모두 머리 노드 에 대해 단독 적 인 판단 을 해 야 한다. 그러면 진짜 머리 노드 의 논 리 는 시간 이 있다.그래서 편 의 를 위해 우 리 는 가상 헤드 노드 를 설정 하여 진짜 헤드 노드 의 특수성 을 차단 합 니 다.
단순 복잡 도 분석
우 리 는 링크 의 조작 에서 쉽게 알 수 있 듯 이 삭제 와 수정 에 대해 이 몇 가지 조작 의 복잡 도 는 모두 O (n) 이다. 그러나 만약 에 우리 가 링크 의 머리 를 증가/삭제/검사 하 는 조작 만 한다 면 그의 복잡 도 는 바로 O (1) 이다. 여기 서도 우리 의 링크 가 하기에 적합 한 일 을 알 수 있다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.