文章目录
上一篇文章我们讲了关于使用快慢指针来解决链表的相关问题,这篇文章我们就来主要讲一讲关于链表需要逆置的时候怎么做,有两个链表需要拼接的时候应该怎么做~
一、有关需要注意头结点的特殊问题
这类问题我们要注意新申请一个结点来保存头结点
1、删除链表中等于给定值val的所有结点
(1)题目描述
2、解题思路
-
因为存在可能删除的结点就是头结点的情况。所以要新申请一个头结点newnode,初始化让其指向head
-
使用双指针的办法,初始化一个前置指针prev指向newnode,再初始化一个cur指针指向newnode->next
-
当cur不为空的时候,就进入循环查找和元素val相等的结点
找到了就prev->next = cur->next,break退出循环
没找到就让两个指针向前一直走 -
最后返回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;
}
2、删除重复结点——复杂版
(1)题目要求
(2)解题思路
-
先针对没有结点和只有一个结点的特殊情况进行判断
-
新申请一个头结点newhead,预防头结点就是重复结点的特殊情况
-
初始化两个快慢指针,slow = newhead,fast = newhead->next;
-
循环处理,循环终止的条件就是fast == NULL<