링크 의 이해
10179 단어 데이터 구조
2. 링크 는 어떤 특징 이 있 습 니까?
3. 왜 체인 시 계 를 사용 합 니까?
4. 링크 는 몇 가지 형식 으로 나 뉘 나 요?
직관 적 으로 볼 때 목걸이, 불 주, 시 계 는 모두 링크 의 표현 형식 이 고 링크 는 일련의 결점 으로 구 성 된 데이터 구조 이다.
링크 의 특징: 링크 는 일련의 노드 로 구성 되 고 모든 노드 는 적어도 두 개의 도 메 인 (데이터 도 메 인과 다음 노드 를 가리 키 는 참조 유형) 을 포함 하 며 양 방향 단일 체인 표 와 순환 단일 체인 표 는 부모 노드 를 가리 키 는 참조 유형 도 메 인 이 있다.링크 에 저 장 된 물리 적 주 소 는 비 연속 적 이 고 링크 는 길 지 않 으 며 언제든지 새로운 노드 를 추가 할 수 있 습 니 다.
이전에 우 리 는 배열 로 대열 을 실현 한 적 이 있 습 니 다. 배열 로 실현 할 수 있 는 이상 왜 링크 로 대열 을 실현 하 는 방법 을 사용 해 야 합 니까?배열 과 링크 는 도대체 어떤 차이 가 있 습 니까?
배열 은 길이 가 정 해 져 있 고 배열 은 아래 표 시 를 가지 고 있어 서 배열 이 찾기 가 비교적 편리 하 다. 아래 표 시 를 통 해 찾 고 싶 은 요 소 를 직접 얻 을 수 있다. 배열 로 요 소 를 찾 는 작업 을 할 때 시간 복잡 도 는 1 이 고 배열 에 있 는 요소 가 저 장 된 물리 적 주 소 는 연속 적 이다. 그러면 배열 이 삽입 되 고 삭제 되 는 작업 을 하 는 것 이 비교적 번거롭다.하나의 요 소 를 삽입 하거나 삭제 할 때마다 배열 의 절반 의 데이터 요 소 를 이동 해 야 합 니 다.그러나 링크 는 배열 의 기능 과 반대 되 고 배열 의 장점 은 바로 링크 의 단점 이 며 반대로 도 마찬가지 이다.따라서 데이터 에 대한 조작 에 따라 이 두 가지 방법 을 선택 하여 사용 할 수 있다.삽입 또는 삭제 작업 을 실현 하려 면 링크 를 선택 하 십시오. 링크 는 다음 노드 참조 유형 을 가리 키 는 값 만 수정 하고 시간 복잡 도 는 1 이기 때 문 입 니 다.
링크 는 선형 링크 와 비 선형 링크 로 나 뉜 다.
선형 체인 테이블 은 주로 단일 체인 테이블, 양 방향 체인 테이블, 순환 체인 테이블 을 포함한다.
비 선형 링크 는 주로 나무, 그림 등 을 포함한다.
단일 체인 시트 작업:
링크 로 대기 열 을 실현 하 는 방법:
자바 코드
public void add(Object obj){
if(root==null){//
root=new LinkNode(obj);//
end=root;//
}
else{
LinkNode node=new LinkNode(obj);//
end.setNext(node);//
end=node;//
}
}
대기 열의 길이:
public int size(){
int count=0;
if(root==null){//
return 0;// 0
}
else{// ,
count++;// +1
LinkNode node=root.getNext();//
while(node!=null){
count++;// +1
node =node.getNext();
}
return count;
}
}
아래 표 시 된 요소 에 따라 원 소 를 얻 을 수 있 습 니 다:
public LinkNode get(int index){
int count=0;
if(index>=size()||index<0){//
throw new RuntimeException(" index="+index);//
}
else{
if(index==0){// 0
return root;//
}
else{
LinkNode node=root.getNext();//
while(node!=null){//
count++;// +1
if(index==count){
return node;
}
else
node=node.getNext();
}
}
}
return null;
}
대기 열 에 노드 삽입 하기:
public void insert(LinkNode node,int index){
if(index<0){//
throw new RuntimeException(" index="+index);//
}
else if(index==0){// 0
node.setNext(root);//
root=node;//
}
else if(index>0&&index<=size()-1){// ,
LinkNode node1=get(index-1);//
LinkNode node2=get(index);//
node1.setNext(node);//
node.setNext(node2);
}
else{//
end.setNext(node);//
end=node;//
}
}
열 에 있 는 노드 를 삭제 합 니 다:
public void remove(int index){
if(index<0||index>=size()){//
throw new RuntimeException(" index="+index);//
}
else if(index==0){// 0
LinkNode node1=root.getNext();//
root=node1;//
}
else if(index>0&&index<size()-1){// ,
LinkNode node1=get(index-1);//
LinkNode node2=get(index);//
node1.setNext(node2.getNext());//
}
else{//
LinkNode node1=get(index-1);//
node1.setNext(null);
}
}
결점 의 값 수정:
public void xiuGai(LinkNode node,int index){
if(index<0&&index>size()-1){
throw new RuntimeException(" index="+index);//
}
else {
LinkNode node1=get(index);
node1.setObj(node.getObj());
}
}
양 방향 링크 의 이해:
양 방향 링크 는 실제 적 으로 단일 링크 표 구조 와 유사 하 다. 단지 단일 링크 표 보다 부모 노드 를 가리 키 는 인용 유형 도 메 인 이 많 을 뿐이다. 따라서 양 방향 링크 를 만 들 때 뿌리 노드 를 제외 한 다른 노드 의 부모 노드 를 가리 키 는 인용 유형 도 메 인 을 그의 앞의 노드 를 가리 키 면 된다.
양 방향 링크 작업:
양 방향 링크 만 들 기:
public static LinkNode creatDoubleLink(String [] a){
LinkNode root=new LinkNode(a[0]);
LinkNode node1=new LinkNode(a[1]);
LinkNode node2=new LinkNode(a[2]);
LinkNode node3=new LinkNode(a[3]);
root.setNext(node1);
node1.setNext(node2);
node1.setParent(root);
node2.setParent(node1);
node2.setNext(node3);
node3.setParent(node2);
return root;
}
양 방향 링크 옮 겨 다 니 기:
public static void printNode(LinkNode root){
if(root.getNext()!=null){
Object obj=root.getObj();
System.out.println(" "+obj);
LinkNode node=root.getNext();
printNode(node);
}
else {
Object obj=root.getObj();
System.out.println(" "+obj);
LinkNode parent=root.getParent();
while(parent!=null){
Object ob=parent.getObj();
System.out.println(" "+ob);
parent=parent.getParent();
}
}
}
양 방향 링크 에 요 소 를 삽입 합 니 다:
public static LinkNode insert(LinkNode nodee,int index){
int count=0;// , ,
LinkNode nodeR=creatDoubleLink(root,node);//
LinkNode node1=nodeR.getNext();//
LinkNode last = null;//
if(index<0){//
System.out.println(" !");
}
if(index==0){//
nodee.setNext(nodeR);
nodeR.setParent(nodee);
nodeR=nodee;
}
else{//
while(node1!=null){//
count++;
if(node1.getNext()==null){//
last=node1;//
}
if(count!=index){//
node1=node1.getNext();
}
else {//
nodee.setNext(node1);
nodee.setParent(node1.getParent());
node1.getParent().setNext(nodee);
node1.setParent(nodee);
break;
}
}
if(count<index){//
last.setNext(nodee);
nodee.setParent(last);
}
}
return nodeR;
}
양 방향 링크 의 지정 한 위치의 결산 점 을 삭제 합 니 다:
public static LinkNode delete(int index){
int count=0;//
LinkNode nodeR=creatDoubleLink(root,node);//
LinkNode nodee=nodeR.getNext();//
if(index==0){//
nodeR=nodeR.getNext();//
nodeR.setParent(null);// , Null
}
else{//
while(nodee!=null){
count++;
if(count!=index){//
nodee=nodee.getNext();// node ,
}
else{
if(nodee.getNext()!=null){//
nodee.getParent().setNext(nodee.getNext());
nodee.getNext().setParent(nodee.getParent());
}
else{//
nodee.getParent().setNext(null);
}
}
}
if(count<index){
System.out.println(" !");
return null;
}
}
return nodeR;
}
순환 링크: 링크 를 지정 할 때 이 링크 에 고리 가 있 는 지 판단 합 니 다.
순환 링크 만 들 기:
public static LinkNode createCircleList(String [] sa){
LinkNode root=new LinkNode(sa[0]);
LinkNode node1=new LinkNode(sa[1]);
LinkNode node2=new LinkNode(sa[2]);
LinkNode node3=new LinkNode(sa[3]);
LinkNode node4=new LinkNode(sa[4]);
root.setNext(node1);
node1.setNext(node2);
node2.setNext(node3);
node3.setNext(node4);
//node4.setNext(root);
return node3;
}
순환 링크 에 링 이 있 는 지 판단 하기:
public static boolean isCircle(LinkNode root){
LinkNode fast=root;
LinkNode slow=root;
while(fast!=null&&fast.getNext()!=null){
fast=fast.getNext().getNext();
slow=slow.getNext();
if(fast==slow){
return true;
}
위 에 쓰 인 양 방향 링크 와 순환 링크 의 생 성 방법 은 너무 번 거 로 워 서 약간 수정 되 었 습 니 다.
양 방향 링크 생 성:
public static LinkNode creatDoubleLink(LinkNode root,LinkNode node){
if(root!=null&&biaoji<a.length-1){// ,
biaoji++;// +1
node=new LinkNode(a[biaoji]);//
root.setNext(node);//
node.setParent(root);
LinkNode node1=null;
creatDoubleLink(node,node1);//
}
return root;
}
단 방향 순환 링크 생 성:
public static LinkNode createCircleLink(LinkNode node1){
if(biaoji!=sa.length-1&&root!=null){//
biaoji++;
LinkNode node=new LinkNode(sa[biaoji]);
if(biaoji==sa.length-1){
nodee=node;//
}
node1.setNext(node);//
createCircleLink(node);//
}
else{//
nodee.setNext(root);//
}
return root;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
정수 반전Udemy 에서 공부 한 것을 중얼거린다 Chapter3【Integer Reversal】 (예) 문자열로 숫자를 반전 (toString, split, reverse, join) 인수의 수치 (n)가 0보다 위 또는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.