[알고리즘 기반] 데이터 구조 | 단일 연결 리스트 + 이중 연결 리스트 코드 구현 + 다이어그램 + 원리

여기에 이미지 설명 삽입

머리말

Yao Yaozi는 학교에서 Blue Bridge Cup 및 ACM 선택 대회를 준비하고 있으며 최근 알고리즘에 대해 배우고 있기 때문입니다. 저는 AcWing 사이트의 도움으로 배웠습니다. 이 글은 제 학습 내용에 대한 노트입니다. 원리에 대한 설명 중 일부는 친구들이 제 학습 과정에서 총알 화면이나 댓글을 볼 수 있습니다. 아주 좋은 것 같습니다 . 이 기사는 주로 알고리즘 효율성을 향상시키기 위해 다양한 데이터 구조를 시뮬레이션하기 위해 주로 배열을 사용하는
데이터 구조에 관한 것입니다 . 상대적으로 애매하고 대머리인 곳에서는 이해하기 위해 그림을 그리는 것이 익숙하기 때문에 알고리즘 템플릿이나 주제를 기반으로 정성스럽게 그린 다이어그램을 보실 수 있을 거에요 함께 알고리즘을 배우고 있는 학생들에게 도움이 되었으면 좋겠습니다! 야오야오지는 아직 신인이라 잘 이해가 안가는 부분이나 잘 이해되는 부분이 있을 수 있으니 더 지적해주세요!

알아채다! 아래 각 데이터 구조의 설명 방법은 코드 템플릿 + 텍스트 설명 및 설명 + 다이어그램을 채택합니다.

1. 단일 연결 리스트(인접 리스트)

기능: 주로 인접 목록 , 스토리지 그래프트리 에 사용됨

코드 템플릿

// head存储链表头,e[]存储节点的值,ne[]存储节点的next指针,idx表示当前用到了哪个节点,后一个
int head, e[N], ne[N], idx;
//NULL相当于-1,所以head = -1相当于head=NULL
// 初始化
void init()
{
    
    
    head = -1;
    idx = 0;
}

// 在链表头插入一个数a
void insert(int a)
{
    
       
    e[idx] = a, ne[idx] = head, head = idx ++ ;
}
//将x插入到下标是k的点之后
void insert(int k, int x)
{
    
    
	e[idx] = x;
	ne[idx] = ne[k]
	ne[k] = idx;
	idx ++;
}

// 将头结点删除,需要保证头结点存在
void remove()
{
    
    
    head = ne[head];
}
  • 스토리지 노드 배열 e[N]과 노드를 저장하는 다음 포인터 배열은 ne[N]첨자를 통해 연결됩니다.
  • idx는 현재 연산의 위치만 기록하고, 일반적으로 구현되는 연결 리스트 idx는 순서가 맞지 않음(전방 노드와 후방 노드의 배열 첨자는 연속적일 필요는 없으며, 현재 ne를 통해 다음 idx를 찾아야 함) [i] 이것은 둘 사이의 연결이기도 합니다 .
  • head 의 시작 부분에서 =-1이 -1은 물리적 주소와 동일하며 NULL연결 ​​목록이 비어 있음을 나타냅니다. 즉, head가 head 노드를 가리키고 head interpolation 방법을 사용하여 이 빈 노드를 꼬리 노드 . 연관 구조에 의해 구현된 단일 연결 리스트의 마지막 노드의 포인터 필드는 NULL따라서 배열은 단일 연결 리스트의 마지막 노드를 구현하고 i라고 가정하면 ne[i]=-1;
  • 여기서 시뮬레이트된 것은 헤드 노드가 없고 헤드 포인터가 헤드 노드 의 단일 연결 목록을 직접 가리킨다는 것입니다.
  • 배열로 시뮬레이션한 연결 리스트는 구조체/클래스 시뮬레이션으로는 잘 이해되지 않지만 본질은 같다.노드 노드에 비유할 수 있다.
  • 그래서 사실 그림을 그릴 때 그렇게 명확하게 구분할 필요는 없습니다 사실 배열로 연결된 리스트를 시뮬레이트하는 방법을 배우기 전에는 항상 배열과 연결된 리스트가 물리적 구조 한다고 생각 했습니다 . 연결된 목록이 실제로는 논리적 구조라는 것을 알아내십시오 !
비교 포인트 구조체/클래스 모의 노드 어레이 아날로그 노드
노드 자체 포인터 물리적 주소, 노드 배열을 첨자로 하여 자체 포인터를 나타냅니다.
숫자 필드 그냥 구조에서 정의node.val val[node], 배열을 통해 값 필드 저장
포인터 필드 구조에서 정의,node. next 배열을 통해 저장되는 next[노드]

그래픽
여기에 이미지 설명 삽입
삽입 작업(헤드 삽입 방식)
여기에 이미지 설명 삽입

2. 이중 연결 리스트

단일 연결 목록을 시뮬레이트하는 배열에 대해 배운 후 이중 연결 목록은 실제로 이해하기 쉽습니다. 실제로 포인터 필드가 하나 더 있습니다.

  • 단일 연결 리스트: ne[i]는 포인터가 i인 노드의 다음 포인터를 저장합니다.
  • 이중 연결 리스트
    • l[i], 포인터가 i인 노드의 선행 노드(이전 노드를 가리킴)
    • r[i], 포인터가 i인 노드의 백드라이버(다음 노드를 가리킴)
//e[index],表示节点的值,l[index]表示节点的左指针,r[index]表示节点的右指针,idx表示当前用到哪个节点的”地址“

int e[N],l[N],r[N],idx;

//初始化
void init(){
    
    
  //0是左端点,1是右端点
  r[0] = 1,l[1] = 0;
  idx = 2;
}
//在节点a的右边插入一个数x
void insert(int a,int x){
    
    
  //1、让待插入节点占位
  e[idx] = x;
  //2、处理待插入点左右两侧
  l[idx] = a,r[idx] = r[a];//注意,这里必须是r[a],因为a的下一个节点不一定和a顺序存储
  //3、处理前一个节点和后一个节点
  l[r[a]] = idx,r[a] = idx++;
}

여기에 이미지 설명 삽입

여기에 이미지 설명 삽입
Java Island Adventures [하얀백에서 보스까지의 여정]

LeetCode 일일 질문 – 거대 공장 습격

추천

출처blog.csdn.net/Yaoyao2024/article/details/129621855