⭐️前面的话⭐️
大家好!博主开辟了一个新的专栏——剑指offer,我要开始刷题了!这个专栏会介绍《剑指offer》书上所有的面试编程题。并且会分享一些我的刷题心得。由于博主水平有限,如有错误,欢迎指正,如果有更好的解题思路和算法可以分享给博主哦!一起加油!一起努力!
📒博客主页:未见花闻的博客主页
🎉欢迎关注🔎点赞👍收藏⭐️留言📝
📌本文由未见花闻原创,CSDN首发!
📆首发时间:🌴2021年9月6日🌴
✉️坚持和努力一定能换来诗与远方!
💭参考书籍:📚《剑指offer第1版》,📚《剑指offer第2版》
💬参考在线编程网站:🌐牛客网🌐力扣
🙏作者水平很有限,如果发现错误,一定要及时告知作者哦!感谢感谢!
博主的码云gitee,平常博主写的程序代码都在里面。
⭐️剑指 Offer 18. 删除链表的节点⭐️
🔐题目详情
给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。
返回删除后的链表的头节点。
注意:此题对比原题有改动
示例:
输入: head = [4,5,1,9], val = 5
输出: [4,1,9]
解释: 给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9.
输入: head = [4,5,1,9], val = 1
输出: [4,5,9]
解释: 给定你链表中值为 1 的第三个节点,那么在调用了你的函数之后,该链表应变为 4 -> 5 -> 9.
限制:
题目保证链表中节点的值互不相同
若使用 C 或 C++ 语言,你不需要 free 或 delete 被删除的节点
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/shan-chu-lian-biao-de-jie-dian-lcof
💡解题思路
方法: 双指针。
使用双指针的方法,这道题可以分为两种情况,第一种情况,当链表第一个元素就是需要删除的元素时,直接将头结点删除。第二种情况,当链表的第一个元素不是需要删除的元素时,定义结点cur
,用来比较其对应的值是否与需要删除的值val
相等(这道题不会出现重复元素),另一个结点prev
用来储存cur
的上一个结点,如果cur->val == val
,就将cur
的前一个结点的next
指向cur
结点的next
,以删除cur
结点。
时间复杂度: O(N)
空间复杂度: O(1)
🔑源代码
编程语言:C语言
在线编程平台:力扣
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* deleteNode(struct ListNode* head, int val){
if (head == NULL)
return NULL;
struct ListNode* cur = head;
struct ListNode* prev = head;
if (head->val == val)
{
head = head->next;
return head;//需要删除的结点为链表第一个元素
}
while (cur)
{
if (cur->val == val)
{
prev->next = cur->next;
break;//需要删除的结点不为链表第一个元素
}
prev = cur;
cur = cur->next;
}
return head;
}
🌱总结
对与无重复元素链表元素的删除,可以分情况采用双指针的方法删除目标结点。