链表《4》删除链表中的结点

下图是一个创建好的链表

下面我们需要删除一个结点,例如删除第3个结点

首先定义一个指针p,并且将p指向第二个结点

然后定义一个指针q,将q指向需要删除的结点

将p指向的结点和q指向的结点相连

p->pNext = q->pNext

清空q指向的结点

free(q);

q = NULL;

删除后的链表

程序代码:

#include <stdio.h>
#include <stdlib.h>

typedef struct Node//结点结构
{
	int data;//数据域

	struct Node *pNext;//指针域
}NODE, *PNODE;

//创建链表
PNODE Create_list(void);

//遍历链表
void Traverse_list(PNODE pHead);

//删除链表中的结点
void Delete_list(PNODE pHead, int pos);

void main()
{
	PNODE pHead = NULL;

	pHead = Create_list();//创建一个非循环单链表

	Traverse_list(pHead);//遍历链表

	Delete_list(pHead, 3);

	Traverse_list(pHead);//遍历输出链表中的数据

	system("pause");
}

//创建链表
PNODE Create_list(void)
{
	int len;//结点的个数

	int val;//临时保存结点的值

	//分配一个不存放有效数据的头结点
	PNODE pHead = (PNODE)malloc(sizeof(NODE));

	if(NULL == pHead)
	{
		printf("内存分配失败,程序终止!");

		exit(-1);
	}

	//定义一个永远指向尾结点的结点
	PNODE pTail = pHead;
	pTail->pNext = NULL;

	printf("请输入您需要生成的链表的结点的个数:");
	scanf("%d",&len);

	for(int i=0; i<len; i++)
	{
		printf("请输入第%d个结点的值:", i+1);
		scanf("%d",&val);

		//创建一个临时结点
		PNODE pNew = (PNODE)malloc(sizeof(NODE));

		if(NULL == pNew)
		{
			printf("内存分配失败,程序终止!");

			exit(-1);
		}

		pNew->data = val;
		pTail->pNext = pNew;
		pNew->pNext = NULL;
		pTail = pNew;
	}

	return pHead;
}

//遍历链表
void Traverse_list(PNODE pHead)
{
	PNODE p = pHead->pNext;

	while(NULL != p)
	{
		printf("%d ", p->data);

		p = p->pNext;
	}

	printf("\n");

	return;
}

//删除链表中的结点
void Delete_list(PNODE pHead, int pos)
{
	PNODE p = pHead;//定义一个指向头结点的指针p用于查找删除结点的位置

	int i = 0;//定义一个变量i用于查找删除结点的位置

	//寻找删除结点的位置
	while(NULL != p->pNext && i<pos-1)
	{
		p = p->pNext;

		i++;
	}

	//判断是否找到了删除结点的位置
	if(NULL == p->pNext || i>pos-1)
	{
		printf("没找到删除结点的位置!\n");

		return;
	}

	PNODE q = p->pNext;//将q指向需要删除的结点

	p->pNext = q->pNext;//将p指向需要删除的结点的后一个结点(删除了q所指向的结点)

	free(q);//清空指针q指向的结点
	q = NULL;
}

执行结果:

链表《4》删除链表中的结点

时间: 2024-07-30 20:18:10

链表《4》删除链表中的结点的相关文章

剑指Offer(链表)-删除链表中重复的节点

(删除链表中重复的节点)题目描述: 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 解题思路:这里的重复的节点不保留是将只要重复了的节点都要删除掉,所以考虑利用哈希set的方法,先进行重复性的判断,将重复的元素加入到哈希set中去,然后将重复的元素删除. 利用到了两个指针pre和cur,来表示前一个节点和当前节点. /* public

链表问题----删除链表的中间节点和a/b处的节点

删除链表的中间节点和a/b处的节点 对于给定一个链表的头节点head,实现删除链表的中间节点的函数. 例如 不删除任何节点: 1->2,删除节点1 1->2->3,删除节点2 1->2->3->4,删除节点2 1->2->3->4->5,删除节点3 如果将本问题复杂一下,给定链表的头节点head.整数a和整数b,实现删除位于a/b处节点的函数. 例如 链表:1->2->3->4->5,假设 a/b 的值为r 如果 r 等于

生成单向链表 并删除链表中某个元素

leetcode 题目描述: Remove all elements from a linked list of integers that have value val. Example Given: 1 --> 2 --> 6 --> 3 --> 4 --> 5 --> 6, val = 6 Return: 1 --> 2 --> 3 --> 4 --> 5 生成链表 若输入元素不为0,则加入到链表尾部,若为0,不加入,且生成链表工作完成.代

循环单链表 | 循环删除表中所有最小值并输出

王道P38T19 代码: void del_min(LinkList& L){ LNode*p=L,*mp=L; while(p->next!=p){ if(p->next==L){ //进行了一轮 LNode*del=mp->next; mp->next=del->next; printf("%d ",del->data); p=p->next; //跳过头结点 (这个语句放在删除语句之前) delete del; mp=L; con

给定一个链表,删除链表的倒数第 n 个节点(已知该结点存在),并且返回链表的头结点。

思路: 找到倒数第n个结点的前一个结点,让该结点的后继为倒数第n个结点的后继 子问题:找到倒数第n个结点的前驱 1.有两个引用,第一个引用指向首节点,然后走n步 2.第二个结点指向首节点,此时两结点之间隔了n-1个结点,保持这样的距离,共同向后移动 3.当第一个引用到达尾节点时,第二个引用离尾节点有n-1个结点, 4.此时第二个结点为倒数第n+1个结点,即倒数第n个结点的前驱 特殊情况: 1.链表只有一个结点或者为空链表,直接返回空即可: 2.链表的长度刚好等于n,即删除首节点,第一个引用从头结

单链表之删除链表重复数据

1 public static void deleteDup(Node head){ 2 Node p = head; 3 while(p!=null){ 4 Node q = p; 5 while(q.next != null){ 6 if(p.data == q.next.data){ 7 q.next = q.next.next; 8 //不能加q = q.next; 9 }else{ 10 q = q.next; 11 } 12 } 13 p = p.next; 14 } 15 }

删除链表中倒数第n个节点

1.给定一个链表,删除链表中倒数第n个节点,返回链表的头节点. 给出链表1->2->3->4->5->null和 n = 2. 删除倒数第二个节点之后,这个链表将变成1->2->3->5->null. 注意 链表中的节点个数大于等于n 挑战 O(n)时间复杂度 解题思路:刚开始看到倒数第n个节点,不禁感慨如果是数组就可以直接倒着来了.不过针对链表,一定要想起来最常用的方法---快慢指针.设一个fast和slow指针:快指针先走n步,然后快慢指针一起走,

lintcode 容易题:Remove Nth Node From End of Lis 删除链表中倒数第n个节点

题目: 删除链表中倒数第n个节点 给定一个链表,删除链表中倒数第n个节点,返回链表的头节点.  样例 给出链表1->2->3->4->5->null和 n = 2. 删除倒数第二个节点之后,这个链表将变成1->2->3->5->null. 注意 链表中的节点个数大于等于n 解题: 要删除倒数第n个节点,我们要找到其前面一个节点,也就是倒数第n+1的节点,找到这个节点就可以进行删除.和上题的思想很类似, 定义两个指针,p和cur,cur指针向前走,走了n

LintCode Python 简单级题目 174.删除链表中倒数第n个节点

题目描述: 给定一个链表,删除链表中倒数第n个节点,返回链表的头节点. 注意事项 链表中的节点个数大于等于n 您在真实的面试中是否遇到过这个题? Yes 样例 给出链表1->2->3->4->5->null和 n = 2. 删除倒数第二个节点之后,这个链表将变成1->2->3->5->null. 挑战 O(n)时间复杂度 标签 两根指针 链表 题目分析: 创建两个指针,head指向表头.curent指向链表第n个元素: 循环后移n次,直至curent=

LeetCode(19):删除链表的倒数第N个节点

Medium! 题目描述: 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 示例: 给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点后,链表变为 1->2->3->5. 说明: 给定的 n 保证是有效的. 进阶: 你能尝试使用一趟扫描实现吗? 解题思路: 这道题让我们移除链表倒数第N个节点,限定n一定是有效的,即n不会大于链表中的元素总数.还有题目要求我们一次遍历解决问题,那么就得想些比较巧妙的方法了.比如