遍历一次删除倒数第k个节点

本文介绍了一种仅遍历一次链表即可删除倒数第k个节点的方法。通过设置双指针p和q,p先前进至第k个节点,随后p和q同步移动直至p到达链表尾部,此时q指向待删除节点的前一个节点,从而实现高效删除。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如果遍历两遍链表,很容易就能想到方法,先遍历一边求出链表长度n,遍历第二遍时遍历到n-k位置删除n-k+1个节点

现在是遍历一遍过程也很简单

1.声明两个指针p、q,分别指向链表头结点,让p遍历到第k个节点处

2.若p还没到k处就指向空,则链表长度不够,返回head

3.p、q同时开始遍历链表直到p遍历到链表最后一个节点,这是q到达n-k个节点处,删除到q的下一个节点即可

代码:

Node * deleteN(Node * head, int n) {
        if (head == NULL || n <= 0)
		return head;
	Node * pNode = head->next;
	for (int i = 0; i < n; i++) {
		if (pNode->next != NULL)
			pNode = pNode->next;
		else
			return head;
	}
	Node * qNode = head->next;
	while (pNode->next)//到达要删除节点的前一个节点
	{
		pNode = pNode->next;
		qNode = qNode->next;
	}
	Node * temp = qNode->next;
	qNode->next = qNode->next->next;
	delete temp;
	return head;
}

运行结果:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值