题目如下:
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
示例 1:
输入:head = [1,2,3,4,5], n = 2 输出:[1,2,3,5]
示例 2:
输入:head = [1], n = 1 输出:[]
示例 3:
输入:head = [1,2], n = 1 输出:[1]
效果如下:
结构体定义:
typedef struct Node {
int val;
struct Node* next;
}Node;
typedef Node* List;
第一部分
List head, head1, tail;
Node* p,*p1;//p用来创建空节点,p1用来释放被删除节点的内存
p = (Node*)malloc(sizeof(struct Node));
int ch;
int n = 0,n1;
head = p,head1=p;
tail = p;
p1 = p;
head->next = NULL;
printf("请输入链表内容");
while ((ch = getchar()) != '\n') {
if (ch == ' ')
continue;
else {
p = (Node*)malloc(sizeof(struct Node));
p->val = ch - 48;
tail->next = p;
tail = p;
tail->next = NULL;
n += 1;//用来记录链表的节点个数
}
}
这一部分主要是进行输入,将我们输入的值逐个储存进链表中。
第二部分
printf("请输入你想要删除倒数第几个节点");
scanf("%d", &n1);
if (n - n1 >= 0&&n>1) {
for (int i = 0; i < n - n1; i++) {//n-n1是为了让head指向要删除的那个节点的上一个节点
head = head->next;
}
p1 = head->next;
head->next = p1->next;
free(p1);//释放我们要删除的那个节点分配的内存
}
else if (n==1) {
head = head->next;
free(head);
return 0;
}
while (head1->next != NULL) {
head1 = head1->next;
printf("%d ", head1->val);
}
return 0;
在这里我们使用一个for循环让我们的head指向要删除的节点的上一个节点,
方便我们进行删除。
接下来我们进行了判断。
如果节点个数大于1(不包括头节点)并且要删除的不是第一个储存数值的节点,那么我们就用一个指向结构体的指针来进行我们的删除操作,并且释放内存。
如果节点个数为1或者大于1并且要删除的是第一个储存数值的节点,那么我们就不需要用指针p来进行删除,直接用head来进行删除。
最后我们再进行打印删除过后的节点内容。