자바 링크 에서 요소 삭제 의 실현 방법 에 대한 상세 한 설명[하나의 요소 만 삭제 하 는 경우]
6102 단어 Java링크 에서 요소 삭제
이 부분 은 이전 절 과 밀접 한 관 계 를 가진다.링크 에서 요 소 를 어떻게 삭제 하 는 지 에 대해 우 리 는 한 걸음 한 걸음 분석 했다.
1.그림 삭제 논리
만약 에 우리 가 링크 에서 색인 이 2 위치 인 요 소 를 삭제 해 야 한다 고 가정 하면 이때 링크 구 조 는 다음 과 같다.
색인 이 2 위치 인 요 소 를 삭제 하려 면 색인 이 2 위치 인 요소 이전의 선행 노드(이때 색인 이 1 인 위치 요소)를 가 져 와 야 하기 때문에 선행 노드 를 기록 하기 위해 변 수 를 prev 로 설계 해 야 합 니 다.
1.초기 변수 prev 가 가상 헤드 노드 dummyHead 를 가리 키 고 있 습 니 다.
2.선행 노드 의 위 치 를 찾 습 니 다.(이 예 에서 선행 노드 가 색인 이 1 인 위치 에 있 는 요소)
이 때 prev 가 기록 한 next 는 삭제 해 야 할 노드 로 delNode 변수 로 기록 합 니 다.
3.삭제 작업
첫 번 째 단계:prev 의 next 를 delNode 의 next 로 가 리 킵 니 다.그림 참조:
코드:
prev.next=delNode.next;
두 번 째 단계:자바 가 삭 제 된 공간 을 회수 할 수 있 도록 삭제 해 야 할 노드 를 링크 에서 수 동 으로 분리 합 니 다.즉,delNode 의 next 가 null 로 변 합 니 다.코드:
delNode.next=null;
2.코드 삭제 논리 실현2.1 링크 에서 제 index(0-based)개 위치의 요 소 를 삭제 하고 삭 제 된 요 소 를 되 돌려 줍 니 다.
먼저,현재 선행 노드 가 가상 헤드 노드 를 가리 키 는 것 을 초기 화한 다음 에 삭 제 된 노드 의 선행 노드 를 찾 아 옮 겨 다 니 며 삭제 논 리 를 실행 합 니 다.
// index(0-based) , ( , )
public E remove(int index) {
if (index < 0 || index >= size) {
throw new IllegalArgumentException("remove failed,Illegal index");
}
//
Node<E> prev = dummyHead;
for (int i = 0; i < index; i++) {
//
prev = prev.next;
}
Node<E> retNode = prev.next;//
prev.next = retNode.next;
retNode.next = null;
size--;
return retNode.e;
}
2.2 링크 에서 첫 번 째 요 소 를 삭제 하고 삭 제 된 요 소 를 되 돌려 줍 니 다.reove(int index)방법 으로 이 방법 을 실현 합 니 다.
// ,
public E removeFirst() {
return remove(0);
}
2.3 링크 에서 마지막 요 소 를 삭제 하고 삭 제 된 요 소 를 되 돌려 줍 니 다.reove(int index)방법 으로 이 방법 을 실현 합 니 다.
// ,
public E removeLast() {
return remove(size - 1);
}
3.테스트 삭제 논리이전 테스트 코드 를 기반 으로 논리 코드 를 추가 로 삭제 합 니 다.이 때 모든 테스트 코드 를 붙 입 니 다.
package LinkedList;
public class TestMain {
public static void main(String[] args) {
LinkedList<Integer> linkedList = new LinkedList<Integer>();
System.out.println("============ ============");
for (int i = 0; i < 5; i++) {
linkedList.addFirst(i);
System.out.println(linkedList);
}
System.out.println("============ ============");
linkedList.set(2, 666);
System.out.println(linkedList);
System.out.println("============ 666 ============");
linkedList.remove(2);
System.out.println(linkedList);
}
}
결 과 는:4.링크 의 시간 복잡 도 분석
4.1 작업 시간 복잡 도 추가
(1)링크 끝 에(addLast()를 추가 하려 면 처음부터 옮 겨 다 녀 야 합 니 다.시간 복잡 도 는 O(n)입 니 다.
(2)링크 머리 에(addFirst()를 추가 하고 시간 복잡 도 는 O(1)이다.
(3)링크 의 임 의 위치 에 추가(add(int index,E e),평균 상황 에서 O(n/2)=O(n);
4.2 작업 시간 복잡 도 삭제
(1)링크 의 마지막 요소(removeLast()를 삭제 하려 면 마지막 요소 의 이전 요 소 를 찾 아야 하기 때문에 시간 복잡 도 는 O(n)입 니 다.
(2)링크 의 첫 번 째 요소(removeFirst()를 삭제 하고 시간 복잡 도 는 O(1)입 니 다.
(3)링크 의 임 의 위치 노드(reove(index)를 삭제 하고 평균 상황 에서 시간 복잡 도 는 O(n/2)=O(n)이다.
4.3 수정 작업
링크 가 무 작위 접근 을 지원 하지 않 기 때문에 수정 할 노드 를 찾 을 때 까지 처음부터 찾 아야 하기 때문에 시간 복잡 도 는 O(n)입 니 다.
4.4 찾기 동작
링크 가 무 작위 접근 을 지원 하지 않 기 때문에 필요 한 노드 를 찾 을 때 까지 처음부터 찾 아야 하기 때문에 시간 복잡 도 는 O(n)입 니 다.
위 에서 알 수 있 듯 이 링크 의 추가 작업,삭제 작업,수정 작업,찾기 작업 의 시간 복잡 도 는 모두 O(n)이다.이 를 보면 마음 이 반 쯤 식 었 다.이것 은 mao 를 만 드 는 것 보다 배열 을 만 드 는 것 이 낫 지 않다.사실은 이런 것 이다.배열 에 대해 색인 만 있 으 면 빠 른 방문 을 할 수 있 기 때문이다.그러나 링크 에 있어 우 리 는 링크 헤드 에 만 추가 작업,삭제 작업,찾기 작업 을 하면 그의 시간 복잡 도 는 모두 O(1)이다.이 때 는 배열 과 마찬가지 로 동태 적 이 고 메모리 공간 을 대량으로 낭비 하지 않 는 다.이것 이 바로 그의 장점 이다.링크 는 가장 기본 적 인 동적 데이터 구조 이 고 이 를 바탕 으로 링크 에 대한 응용 이 더 많 을 것 이다.
이 소절 에 대하 여 괜 찮 고 괜찮다 고 생각 하 시 면 추천 해 주세요.감사합니다!
링크 의 소스 코드 https://github.com/FelixBin/dataStructure/tree/master/src/LinkedList
자바 알고리즘 과 관련 된 내용 에 관심 이 있 는 독자 들 은 본 사이트 의 주 제 를 볼 수 있 습 니 다.자바 데이터 구조 및 알고리즘 튜 토리 얼,자바 조작 DOM 노드 기술 총화,자바 파일 과 디 렉 터 리 작업 기법 집합과자바 캐 시 작업 기법 집합
본 고 에서 말 한 것 이 여러분 의 자바 프로 그래 밍 에 도움 이 되 기 를 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.