剑指offer----O(1)时间删除给定链表中的节点
2016-07-14 16:30
399 查看
如果从头开始遍历,遍历到给定节点的前一个节点,让它的前一个指向它的下一个,该节点指向为空,就把该节点删除掉了,但是这个时间复杂度为O(N);
思路:既然是给出了一个链表中的节点,我们可以根据这个节点的next属性找到它的下一个节点,让该节点的值和next都等于下一个节点的值和next就达到对下一个节点的复制,该节点的值和next都被覆盖掉了,然后把删除它的下一个节点,也就达到对给定节点的删除。
(1)链表中有多个节点删除的不是尾节点
(2)链表中只有一个节点,且删除这个节点
(3)删除链表的尾节点;
class ListNode
{
int val;
ListNode next = null;
ListNode(int val)
{
this.val = val;
}
}
public class DeleteNode
{
public void deleteNode(ListNode pHead,ListNode toBeDeleted)
{
if(pHead==null || toBeDeleted==null)
{
return;
}
//如果要删除的节点不是最后一个节点,可以把要删除的节点的next val换成它下一个节点的内容
if(pHead.next != null)
{
ListNode pNext = toBeDeleted.next;
toBeDeleted.val = pNext.val;
toBeDeleted.next = pNext.next;
pNext = null;
}
//链表中只有一个节点
else if(pHead == toBeDeleted)
{
toBeDeleted = null;
pHead = null;
}
//删除链表的尾节点 找到尾节点的前一个节点
else
{
ListNode pre = pHead;
while(pre.next != toBeDeleted)
{
pre = pre.next;
}
pre.next = null;
toBeDeleted = null;
}
}
}
思路:既然是给出了一个链表中的节点,我们可以根据这个节点的next属性找到它的下一个节点,让该节点的值和next都等于下一个节点的值和next就达到对下一个节点的复制,该节点的值和next都被覆盖掉了,然后把删除它的下一个节点,也就达到对给定节点的删除。
(1)链表中有多个节点删除的不是尾节点
(2)链表中只有一个节点,且删除这个节点
(3)删除链表的尾节点;
class ListNode
{
int val;
ListNode next = null;
ListNode(int val)
{
this.val = val;
}
}
public class DeleteNode
{
public void deleteNode(ListNode pHead,ListNode toBeDeleted)
{
if(pHead==null || toBeDeleted==null)
{
return;
}
//如果要删除的节点不是最后一个节点,可以把要删除的节点的next val换成它下一个节点的内容
if(pHead.next != null)
{
ListNode pNext = toBeDeleted.next;
toBeDeleted.val = pNext.val;
toBeDeleted.next = pNext.next;
pNext = null;
}
//链表中只有一个节点
else if(pHead == toBeDeleted)
{
toBeDeleted = null;
pHead = null;
}
//删除链表的尾节点 找到尾节点的前一个节点
else
{
ListNode pre = pHead;
while(pre.next != toBeDeleted)
{
pre = pre.next;
}
pre.next = null;
toBeDeleted = null;
}
}
}
相关文章推荐
- [C/C++]反转链表
- C#实现基于链表的内存记事本实例
- C#模拟链表数据结构的实例解析
- C语言实现带头结点的链表的创建、查找、插入、删除操作
- C++利用静态成员或类模板构建链表的方法讲解
- C++实现简单的学生管理系统
- Linux内核链表实现过程
- C++链表倒序实现方法
- C#通过链表实现队列的方法
- Node.js环境下JavaScript实现单链表与双链表结构
- C#实现的简单链表类实例
- 找出链表倒数第n个节点元素的二个方法
- Java数据结构之简单链表的定义与实现方法示例
- Java模拟有序链表数据结构的示例
- C语言单循环链表的表示与实现实例详解
- C++实现的链表类实例
- PHP小教程之实现链表
- PHP中模拟链表和链表的基本操作示例
- C语言双向链表的表示与实现实例详解
- js链表操作(实例讲解)