【链表】在O(1)的时间删除链表的节点

 1 /**
 2  * 在O(1)的时间删除链表的节点
 3  *
 4  * @author
 5  *
 6  */
 7 public class Solution {
 8
 9     public static void deleteNode(Node head, Node deletedNode) {
10         if (null == head || null == deletedNode) {
11             return;
12         }
13
14         if (deletedNode.next != null) { // 删除的不是尾节点
15
16             System.out.println("1-----");
17
18             Node nextNode = deletedNode.next;
19             deletedNode.value = nextNode.value;
20             deletedNode.next = nextNode.next;
21
22         } else if (head == deletedNode) { // 删除的是尾节点,同时尾节点也是头节点,整个链表只有一个节点
23
24             System.out.println("2-----");
25
26             head = null;
27             deletedNode = null;
28
29         } else { // 删除的是尾节点,但是链表不止一个节点
30
31             System.out.println("3-----");
32
33             // 遍历链表,找出尾节点的前一个节点,将next置为null
34             Node pNode = head;
35             while (pNode.next != deletedNode) {
36                 pNode = pNode.next;
37             }
38
39             pNode.next = null;
40             deletedNode = null;
41         }
42     }
43
44     public static void main(String[] argss) {
45
46         Node third = new Node(2, null);
47         Node second = new Node(1, third);
48         Node first = new Node(0, second);
49
50         deleteNode(first, third);
51
52     }
53 }
54
55 class Node {
56
57     int value;
58     Node next;
59
60     public Node(int value, Node next) {
61         this.value = value;
62         this.next = next;
63     }
64
65 }
时间: 2024-08-13 07:29:22

【链表】在O(1)的时间删除链表的节点的相关文章

LeetCode之“链表”:在O(1)时间删除链表节点

下边讨论暂不包括尾节点. 一般来说,我们要删除链表中的一个节点是需要知道其上一节点的.但我们真的需要吗? 其实我们可以将待删节点的下一节点的值和指向的下一节点赋予待删节点,然后删除待删节点的下一节点.具体示例程序如下: 1 //O(1)时间删除链表节点,从无头单链表中删除节点 2 void deleteRandomNode(Node *cur) 3 { 4 assert(cur != NULL); 5 assert(cur->next != NULL); //不能是尾节点 6 Node* pNe

面试题18(一):在O(1)时间删除链表结点

// 面试题18(一):在O(1)时间删除链表结点 // 题目:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该 // 结点.链表结点与函数的定义如下: // struct ListNode{ // int m_nValue; // ListNode* m_pNext; // }; // void deleteNode(ListNode** pListHead,ListNode* pToBeDeleted); 解题思路: 这是目前为止,唯一一道,我不看书就知道怎么做的题. 正

【Java】 剑指offer(17) 在O(1)时间删除链表结点

本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点. 思路 通常那样从头开始查找删除需要的时间为O(n),要在O(1)时间删除某结点,可以这样实现:设待删除结点i的下一个结点为j,把j的值复制到i,再把i的指针指向j的下一个结点,最后删除j,效果就相当于删除j. 注意特殊情况:1.当待删除结点i为尾结点时,无下一个结点,则只能从头到尾顺序遍历:2.当链

剑指Offer对答如流系列 - 在O(1)时间删除链表结点

面试题17:在O(1)时间删除链表结点 问题描述 给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点. 链表结构 public class Node{ int val; Node next; public Node(int value,Node next) { val=value; next=next; } } 问题分析 曾经未碰到这道题之前,删除链表的节点,用的方法非常原始.基础(代码如下),很明显这种原始的方式带来的时间复杂度为O(n) //从链表中删除index(0~

《剑指offer》第十八题:在O(1)时间删除链表结点

// 面试题18(一):在O(1)时间删除链表结点 // 题目:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该 // 结点. #include <cstdio> #include "List.h" void DeleteNode(ListNode** pListHead, ListNode* pToBeDeleted) { if (pListHead == nullptr || pToBeDeleted == nullptr) return; //多个

剑指Offer之在O(1)时间删除链表节点

题目描述 给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间删除该节点. 解题思路 在单向链表中删除一个节点,最常规的做法无疑是从链表的头结点开始,顺序的遍历查找要删除的节点,并在链表中删除该节点.这种思路由于需要顺序查找,时间复杂度自然就是$O(n)$了. 之所以需要从头开始查找,是因为我们需要得到将删除的节点的前面一个节点.在单向链表中,节点中没有指向前一个节点的指针,所以只好从链表的头结点开始顺序查找.那是不是一定需要得到被删除的节点的前一个节点呢?答案是否定的.我们可以很方便

在O(1)时间删除链表结点

题目:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点. 链表结点与函数的定义如下: struct ListNode { int m_nValue; ListNode* m_pNext; }; void DeleteNode(ListNode** pListHead,ListNode* pToBeDeleted); 思路:我们可以很方便的得到要删除的结点的下一结点,如果我们把下一个结点的内容复制到需要删除的结点上覆盖原有的内容,再把下一个结点删除.就相当于把当前需要删除的

在O(1)时间删除链表结点——13

给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点. 因为要求时间复杂度为O(1),所以肯定不能遍历链表,那样的话时间复杂度就是O(N)了:可以想到,其实要求删除该结点,真正的目的并不是要将结点的数据包括结点所占的内存都给删除,只是想让数据消失就可以了,至于结点,除去任意一个结点所占的空间都是OK的: 所以,这里换一种思路,若要删除指定的结点,一般需要将前一个结点的next指针指向要删除结点的下一个结点,这样要删除的结点就可以脱离链表而被删除了,但这里关键就是即是单链表没有

剑指offer—第三章高质量代码(o(1)时间删除链表节点)

题目:给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间删除该节点,链表节点与函数的定义如下:struct ListNode{int m_nValue;ListNode* m_pValue;};void DeleteNode(ListNode** pListNode,ListNode * pToBeDeleted){} 思路:将要删除的节点的下一个节点的值赋值给i,删除下一个节点,但要考虑到删除的节点是最后一个节点并且该链表不止有一个节点的情况和该链表只有一个节点,该节点既是头节点也