链表中删除指定结点的两种方式
2018-02-07 11:37
405 查看
题目:给定单项链表的头指针和一个结点指针,定义一个函数在o(1)的时间删除该结点,链表的定义如下:
struct ListNode{
int value;
ListNode* next;
};
函数定义:void DeleteNode(ListNode** PListHead,ListNode* pToBedelete);
如上图所示,想要删除一个单链表的中的某个结点有两种方式:
1、如上图中的( b)所示:要删除i结点,必须从头扫描,扫到h(i的前一个结点),然后让其next值指向j(i的下一个位置),然后就可以删除i了。此方法的复杂度为O(n),因为要删除某个结点必须找到其上一个结点,故需要从头遍历。
2、如上图中的(c)所示:要删除i结点,可以先把i的下一节点的值赋给i结点,然后让i的next值指向下一节点的下一结点,就相当于删除i结点。(注意要保存i->next的这个结点,然后再删除),此算法复杂度为O(1),但是必须要求此要删除结点一定是链表中的结点,且当要删除的结点为最后一个结点时,必须用第一种方法,顺序遍历后找到最后一结点的上一结点,然后删除,但此方法的平均时间复杂度仍然为O(1).
3、如果链表中只有一个结点,而我们又要删除链表的头结点,那么我们在删除节点之后,需要把结点置为空
4、我们以上所有的操作都是基于一个假设,要删除的节点就在链表中。
struct ListNode{
int value;
ListNode* next;
};
函数定义:void DeleteNode(ListNode** PListHead,ListNode* pToBedelete);
如上图所示,想要删除一个单链表的中的某个结点有两种方式:
1、如上图中的( b)所示:要删除i结点,必须从头扫描,扫到h(i的前一个结点),然后让其next值指向j(i的下一个位置),然后就可以删除i了。此方法的复杂度为O(n),因为要删除某个结点必须找到其上一个结点,故需要从头遍历。
2、如上图中的(c)所示:要删除i结点,可以先把i的下一节点的值赋给i结点,然后让i的next值指向下一节点的下一结点,就相当于删除i结点。(注意要保存i->next的这个结点,然后再删除),此算法复杂度为O(1),但是必须要求此要删除结点一定是链表中的结点,且当要删除的结点为最后一个结点时,必须用第一种方法,顺序遍历后找到最后一结点的上一结点,然后删除,但此方法的平均时间复杂度仍然为O(1).
3、如果链表中只有一个结点,而我们又要删除链表的头结点,那么我们在删除节点之后,需要把结点置为空
4、我们以上所有的操作都是基于一个假设,要删除的节点就在链表中。
相关文章推荐
- 6-2 单链表结点删除(20 分)_单链表的删除节点的两种方式——还是双指针和链表覆盖好用
- 指定长度的单链表,删除和插入第i个结点
- 在O(1)时间删除链表中某指定结点
- 删除链表中指定结点
- 链表的基本操作(创建,查找指定位置元素,删除指定元素,插入,倒置,去重,求集合的差,分别交换结点与交换结点值实现的冒泡排序,将两个有序链表合并成一个有序链表)c语言实现
- 删除链表中的重复的结点两种解法
- 链表中删除结点的两种方法
- 剑指offfer--删除链表的指定结点
- leetcode解题之237# Delete Node in a Linked List Java版 (删除链表中指定的结点)
- 在O(1)时间内删除链表指定结点
- o(1)时间删除链表指定结点
- [原]在O(1)时间内删除链表指定结点
- java 链表操作,删除尾结点,指定位置结点
- YTU.3174: 链表基本操作---指定结点删除
- 在O(1)时间删除指定链表结点
- 用链表形式存储一个字符串,插入、删除某个字符,最后按正序、逆序两种方式输出字符串
- 头结点链表的添加结点,删除结点,链表逆序,删除指定数据等操作的实现
- 算法-O(1)时间删除链表的指定结点
- 在O(1)时间删除指定链表结点
- 单链表之在不知道头指针的情况下删除指定结点