【数据结构】——有关拼接、逆转的链表问题

本文详细探讨了链表操作,包括如何处理头结点的特殊问题,如删除等于特定值的结点和删除重复结点;链表的逆转,通过反转单链表来改变指针方向;以及链表的拼接技巧,如合并有序链表和按条件分割链表。文章提供了详细的解题思路和代码实现。
摘要由CSDN通过智能技术生成


上一篇文章我们讲了关于使用快慢指针来解决链表的相关问题,这篇文章我们就来主要讲一讲关于链表需要逆置的时候怎么做,有两个链表需要拼接的时候应该怎么做~

一、有关需要注意头结点的特殊问题

这类问题我们要注意新申请一个结点来保存头结点

1、删除链表中等于给定值val的所有结点

(1)题目描述
在这里插入图片描述
2、解题思路

  1. 因为存在可能删除的结点就是头结点的情况。所以要新申请一个头结点newnode,初始化让其指向head

  2. 使用双指针的办法,初始化一个前置指针prev指向newnode,再初始化一个cur指针指向newnode->next

  3. 当cur不为空的时候,就进入循环查找和元素val相等的结点
    找到了就prev->next = cur->next,break退出循环
    没找到就让两个指针向前一直走

  4. 最后返回newnode->next

3、代码实现

struct ListNode
{
   
	int val;
	struct ListNode* next;
	ListNode(int x) :val(x), next(NULL)
	{
   }
};

ListNode* DeleteNode(ListNode* head, int val)
{
   
	//特殊情况的判断
	if (head == NULL)
	{
   
		return NULL;
	}

	//因为存在删除的是头结点的情况,所以定义一个新的头结点
	ListNode* newNode = new ListNode(-1);
	newNode->next = head;

	//双指针求解
	ListNode* pre = newNode;
	ListNode* cur = head;

	while (cur != NULL)
	{
   
		if (cur->val == val)
		{
   
			pre->next = cur->next;
			break;
		}
		pre = cur;
		cur = cur->next;
	}
	return newNode->next;
}

LC删除结点

2、删除重复结点——复杂版

(1)题目要求
在这里插入图片描述
(2)解题思路

  1. 先针对没有结点和只有一个结点的特殊情况进行判断

  2. 新申请一个头结点newhead,预防头结点就是重复结点的特殊情况

  3. 初始化两个快慢指针,slow = newhead,fast = newhead->next;

  4. 循环处理,循环终止的条件就是fast == NULL<

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值