数据结构——链表

数据结构——链表

链表由指针将若干个节点连接成链状结构。主要有:创建、插入节点、删除节点,代码量少,适合面试。链表是一种动态数据结构,在创建时无须知道链表的长度,插入时只需要为新节点分配内存,然后调整指针指向来确保新节点被链接到链表中。内存分配不在创建链表时一次完成,而是每添加一个节点分配一次内存。没有内存闲置,空间效率比数组高。想找到链表中第i个节点,只能从头节点开始向下遍历,时间效率为O(n)

单向链表

节点定义

struct ListNode{
	int m_nValue;
	ListNode* m_pNext;
}

向单项链表末尾添加一个节点:

void AddToTail(ListNode** pHead, int value){
	ListNode* pNew = new ListNode();
	pNew->m_nValue = value;
	pNew->m_pNext = nullptr;

	if(*pHead == nullptr){
		*pHead = pNew;
	} else {
		ListNode* pNode = *pHead;
		while(pNode->m_pNext != nullptr){
			pNode=pNode->m_pNext;
		}
		pNode->m_pNext = pNew;
	}
}

注意:参数pHead是ListNode**的原因,如果是往空链表里插入节点,那么该节点就是链表的头指针,pNew是函数内定义的,作用域在函数内,要留一个函数外仍起作用的头指针,就要传一个进来。
在链表中找到第一个含某值的节点并删除该节点:

void RemoveNode(ListNode** pHead, int value){
	if (pHead == nullptr || *pHead == nullptr)
		return;
	ListNode* pToBeDeleted = nullptr;
	if ((*pHead)->m_nValue == value){
		pToBeDeleted = *pHead;
		*pHead = (*pHead)->m_pNext;
	} else {
		ListNode*  pNode = *pHead;
		while(pNode->m_pNext != nullptr && pNode->m_pNext->m_nValue != value){
			pNode = pNode->m_pNext;
		}
		if (pNode->m_pNext != nullptr && pNode->m_pNext->m_nValue == value){
			pToBeDeleted = pNode->m_pNext;
			pNode->m_pNext = pNode->m_pNext->m_pNext;
		}
	}
	if(pToBeDeleted != nullptr){
		delete pToBeDeleted;
		pToBeDeleted = nullptr;
	}
}

无论是插入还是删除,都要分两种情况,头指针是要操作的对象还是后面是要操作的对象。
最后一个节点的m_pNext要挂空指针nullptr

环形链表

末尾节点指针指向头节点,可形成环形链表。

双向链表

节点中除了有指向下一个节点的指针,还有指向前一个节点的指针。

复杂链表

节点中除了有指向下一个节点的指针,还有指向任意一个节点的指针。

经典题目(单链表)

剑指offer 面试题6(P58)从尾到头打印链表
tips 利用栈或递归,但链表过长可能导致递归的函数调用栈越界

剑指offer 面试题18(P)删除链表的节点
剑指offer 面试题22(P)链表中倒数第k个节点
剑指offer 面试题24(P)反转链表
剑指offer 面试题25(P)合并两个排序的链表
剑指offer 面试题52(P)两个链表的第一个公共节点

经典题目(环形链表)

剑指offer 面试题62(P)圆圈中最后剩下的数字

经典题目(双向链表)

剑指offer 面试题36(P)二叉搜索树与双向链表

经典题目(复杂链表)

剑指offer 面试题35(P)复杂链表的复制

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值