주제 설명:
헤드 노드가 있는 단일 연결 리스트 L에서 최소 노드를 삭제하는 효율적인 알고리즘을 작성해보십시오(최소 노드가 고유하다고 가정)
답에 대한 아이디어는 아주 명료한데 처음에는 예상하지 못했다.제가 생각한 아이디어는 다음과 같습니다(좀 더 똑바른, 답만큼 발전된 것은 아닙니다).
아이디어:
- 가장 먼저 기억해야 할 것은 단일 연결 목록 에서 요소를 삭제하거나 삽입 하려면 기록해야 한다는 것
被删除的元素的前驱结点
입니다. 왜냐하면 후임 노드는 아무리 나빠도 선행 노드->다음->다음에서 얻을 수 있기 때문입니다. 이다. 따라서 전구체 노드는 필수입니다! - 이 질문에서는 각 노드의 데이터 값을 지속적으로 비교한 다음 현재 가장 작은 노드의 선행자를 기록해야 합니다.
- 그래서 내 생각은 지속적으로 p->next를 비교하는 것입니다. 그러면 선행 노드는 p입니다.
- 그리고 q 포인터는 p(p를 가리킴)를 추적하는 데 사용해야 합니다. 왜냐하면 p->next는 지속적으로 비교되어야 하므로 p는 뒤로 이동해야
最小的那个节点的前驱
하고 q 포인터가 현재 기록 할 때마다
특정 코드(실행 가능):
#include <stdio.h>
#include <stdlib.h>
typedef struct LNode{
int data;
struct LNode *next;
}LNode,*LinkList;
LinkList Init(LinkList L){
int x;
L = (LinkList)malloc(sizeof(LNode));
LinkList r,s;
r = L;
printf("请输入元素:\n");
scanf("%d",&x);
while(x!= 999){
s = (LNode*)malloc(sizeof(LNode));
s->data = x;
r->next = s;
r = s;
printf("请输入元素:\n");
scanf("%d",&x);
}
r->next = NULL;
return L;
}
void print(LinkList L){
LinkList p;
p = L->next;
while(p!= NULL) {
printf("%5d",p->data);
p = p->next;
}
printf("\n");
}
void Del_min(LinkList L){
LinkList p,q,r;
int min;
p = L;
min = p->next->data;
while(p->next != NULL){
if(p->next->data <= min){
min = p->next->data;
q = p;
}
p = p->next;
}
r = q->next;
q->next = r->next;
free(r);
print(L);
}
int main(){
LinkList L,L1;
L1 = Init(L);
printf("打印初始链表:\n");
print(L1);
printf("打印删除最小值之后的链表:\n");
Del_min(L1);
return 0;
}
답을 작성하시오:
void Del_min(LinkList L){
LinkList p,q,r;
int min;
p = L;
min = p->next->data;
while(p->next != NULL){
if(p->next->data <= min){
min = p->next->data;
q = p;
}
p = p->next;
}
r = q->next;
q->next = r->next;
free(r);
}