【数据结构——链表】链表00——链表知识点总结

本文深入探讨了链表的基础概念,包括单向链表的定义与节点插入、删除等操作,并通过经典面试题进行实战演练,涵盖从尾到头打印链表、删除链表节点、查找链表倒数第k个节点等多个实用场景。


链表是一种动态结构,创建链表时,无须知道链表长度,插入一个节点时,只需为新节点分配内存,然后调整指针。

1.单向链表定义

struct ListNode
{
	int data;
	ListNode *pNext;
};

2.链表插入节点

void InsertNode(ListNode** pHead,int data)//pHead头指针
{
	ListNode* pNew = new ListNode();
	pNew->data = data;
	pNew->pNext = NULL;

	if(*pHead == NULL)
	{
		*pHead = pNew;//链表为空时新插入一个节点后,节点就是链表的头指针
	}
	else
	{
		ListNode *pNode = *pHead;//遍历指针
		while(pNode->pNext != NULL)
			pNode = pNode->pNext;//不断遍历直到最后一个,然后插入

		pNode->pNext = pNew;
	}
}

3.链表删除节点

链表内存不是连续的,所以找第i个节点时,需要从开头遍历。效率为O(n).以下为删除链表中含有某值的节点

void DeleteNode(ListNode** pHead,int data)
{
	if(pHead == NULL || *pHead == NULL)
		return;
	ListNode* pToBeDelete = NULL;//初始化要删除的节点
	if((*pHead)->data == data)//头指针就是要删除的节点
	{
		pToBeDelete = *pHead;
		*pHead = (*pHead)->pNext;
	}
	else
	{
		//如果节点不是尾节点,且节点的下个节点不是要删除的节点,则往下遍历
		ListNode* pNode = *pHead;
		while(pNode->pNext != NULL && pNode->pNext->data != data)
			pNode = pNode->pNext;

		//如果下个节点是要删除的,则pNode指向下下个节点
		if(pNode->pNext != NULL && pNode->pNext->data == data)
		{
			pToBeDelete = pNode->pNext;
			pNode->pNext = pNode->pNext->pNext;
		}
		//删节点释放内存
		if(pToBeDelete != NULL)
		{
			delete pToBeDelete;
			pToBeDelete = NULL;
		}
	}
}






剑指offer

1.面试题5——从尾到头打印链表

2.面试题13——O(1)时间删除链表节点

3.面试题15——链表倒数第k个节点

4.面试题16——反转链表

5.面试题17——合并两个排序的链表

6.面试题26——复杂链表的复制

7.面试题37——两个链表的第一个公共节点

编程之美

8.3.4——从无头单链表中删除节点

july

9.79——链表排序的算法

10.给单链表建环

11检测单链表是否有环

12.约瑟夫环

13.双向链表与二叉树



评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值