【算法】——链表题汇总

关于链表相关的题解在我之前的博客里面有过简单的讲解,这篇博客主要是做一个总体的汇总,涉及到整个链表的创建、增删改查等一系列的操作。还有题目的汇总。

文章目录

  • 一、单链表的初始化
  • 二、剑指
    • 1、反转链表
    • 2、复杂链表的复制
    • 3、删除链表的指定结点
    • 4、从尾到头打印链表
    • 5、合并两个有序链表
    • 6、链表中倒数第k个结点
    • 7、两个链表的第一个公共节点
    • 7、二叉树与双向链表
  • 三、其他
    • 1、圆圈中最后剩下的数字
    • 2、返回链表的中间结点
    • 3、判断链表是否是回文结构
    • 4、判断链表中是否有环
    • 5、返回链表入环的第一个结点
    • 6、删除排序链表中的重复结点
      • 6.1删除排序链表中的重复元素——使得每个元素只出现一次
      • 6.1删除排序链表中的重复元素——只保留原始链表
    • 7、链表分割
    • 8、链表相交(两个链表的公共结点)
  • 四、中等难度题
    • 1、链表组件
    • 2、分隔链表
    • 3、链表求和

一、单链表的初始化

具体参考我的另一篇博客单链表详解
在这儿就简单的再叙述一番。基本的能构建出来的代码实现如下:

#include
#include
using namespace std;

//定义结点和链表
typedef struct ListNode
{
   
	int val;
	struct ListNode* next;
}ListNode,*List;

//初始化操作
void InitList(ListNode* plist)
{
   
	assert(plist != NULL);
	if (plist == NULL)
	{
   
		return;
	}
	plist->next = NULL;
}

//头插
bool Insert_Head(ListNode* plist, int val)
{
   
	assert(plist != NULL);
	if (plist == NULL)
	{
   
		return false;
	}
	ListNode* p = new ListNode();
	p->val = val;

	p->next = plist->next;
	plist->next = p;
	return true;
}

//尾插
bool Insert_Tail(ListNode* plist, int val)
{
   
	assert(plist != NULL);
	if (plist == NULL)
	{
   
		return false;
	}
	//先申请结点
	ListNode* p = new ListNode();
	p->val = val;

	//找尾结点
	ListNode* q = plist;
	while (q-

你可能感兴趣的:(数据结构,算法)