题目描述
给出一个单链表,返回删除单链表的倒数第 K 个节点的链表。
输入描述
n 表示链表的长度。
val 表示链表中节点的值。
输出描述
在给定的函数内返回链表的头指针。
示例
输入:
5 4
1 2 3 4 5
输出:
1 3 4 5
解题思路
1、首先求出倒数第K个结点所在的位置
k = n - K
2、定义两个指针
一个pre指向当前结点的前一个结点
一个curr指向当前结点
3、使用for循环遍历
4、判断pre是否为空
为空,表示K比链表的长度还大 或者 当前链表为空 或者K等于当前链表的长度,此时返回当前链表即可
不为空,删除倒数第K个结点,返回头指针。
实现代码
/*
* @Description: 在链表中删除倒数第K个结点
* @Author:
* @Date: 2020-11-08 20:07:10
* @LastEditTime: 2020-11-08 20:33:09
* @LastEditors: Please set LastEditors
*/
#include <iostream>
using namespace std;
struct list_node
{
int val;
struct list_node *next;
}; //链表的节点
int K, n, val;
list_node *input_list(void) //读入链表
{
list_node *phead = new list_node();
list_node *cur_pnode = phead;
scanf("%d %d", &n, &K);
for (int i = 1; i <= n; ++i)
{
scanf("%d", &val);
if (i == 1)
{
cur_pnode->val = val;
cur_pnode->next = NULL;
}
else
{
list_node *new_pnode = new list_node();
new_pnode->val = val;
new_pnode->next = NULL;
cur_pnode->next = new_pnode;
cur_pnode = new_pnode;
}
}
return phead;
}
list_node *remove_last_kth_node(list_node *head, int K)
{
//在下面完成代码
int k = n - K;//倒数第k个结点
list_node *pre = NULL;//前一个结点
list_node *curr = head;//当前结点
for(int i = 0;i < k;i++){
pre = curr;
curr = curr->next;
}
if (pre == NULL)
{
head = curr->next;
delete curr;//删除结点
curr = NULL;//避免称为野指针
}else{
pre->next = curr->next;
delete curr;
curr = NULL;
}
return head;
}
void print_list(list_node *head)
{
while (head != NULL)
{
printf("%d ", head->val);
head = head->next;
}
}
int main()
{
list_node *head = input_list(); // 链表的头节点
list_node *rhead = remove_last_kth_node(head, K);
print_list(rhead);
return 0;
}