精华内容
下载资源
问答
  • 一个节点的next域是固定的,当修改了节点的next域后,不管有多少指针指向这个节点,那么,这些指针的next节点均为修改后的节点,所以,以后要想删除某个节点后的节点时,必须要做到代码段1中的处理方法,先找一个...

    今天晚上被一段代码弄得纠结了半天,最后发现了在使用C语言指针时的的一个不容易发现的陷阱。

    请看下面两段代码,考虑其功能有何不同:

    代码段1:

    t=q->next;
    p->next=q->next->next;
     q=p=p->next;
    free(t);
    代码段2:
    p->next=q->next->next;
    t=q->next;
    q=p=p->next;
    free(t);
    其中最主要的不同点就在于“t=q->next;”的位置不同。

    在代码段1中,t指向的q的下一个节点,但在代码段2中,t指向得却是q的下一个节点的下一个节点,陷阱就在这里!

    注意,一个节点的next域是固定的,当修改了节点的next域后,不管有多少指针指向这个节点,那么,这些指针的next节点均为修改后的节点,所以,以后要想删除某个节点后的节点时,必须要做到代码段1中的处理方法,先找一个指针指向下一个节点,这样,不管怎么修改那个节点的next域,都不会对他的下一个节点产生影响。

    展开全文
  • 单链表删除节点的方法

    千次阅读 2019-02-27 14:12:07
    public class ListNode { int val; ListNode next; ListNode(int x) { val = x; } } ...1.修改指针指向的对象   public static void deleteNodeV2(ListNode head, ListNode node) { if(...
    public class ListNode {
        int val;
        ListNode next;
        ListNode(int x) { val = x; }
    }

    删除一个单链表里的某个指定的节点:

    1.修改指针指向的对象

     

    public static void deleteNodeV2(ListNode head, ListNode node) {
        if(head == null || node == null) {
            return;
        }
        while (head != null) {
            if(head.next.val == node.val) {
                head.next = head.next.next;
                return;
            }
            head = head.next;
        }
    }

    2.指针指向的对象不变,节点的值覆盖,需要被删除node不是尾节点

    public static void deleteNode(ListNode node) {
        if(node == null || node.next == null) {
            return;
        }
        node.val = node.next.val;
        node.next = node.next.next;
        return;
    }

     

    展开全文
  • 访问单个节点的删除

    2016-08-04 00:03:53
    对于单向链表,要删除一个节点A,只要找到节点A的前驱节点AA,然后修改AA指向下一个节点的值,将其指向A节点的后继即可,但本题有限制,已知要删除的节点,又因为是单链表,所以无法获得其前面一个节点指针,...

    题目:实现一个算法,删除单向链表中间的某个结点,假定你只能访问该结点。给定带删除的节点,请执行删除操作,若该节点为尾节点,返回false,否则返回true

    分析:对于单向链表,要删除一个节点A,只要找到节点A的前驱节点AA,然后修改AA指向下一个节点的值,将其指向A节点的后继即可,但本题有限制,已知要删除的节点,又因为是单链表,所以无法获得其前面一个节点的指针,巧妙的做法是将要删除节点的后一个节点的值拷贝到要删除的节点,然后删除要删除节点的后一个节点。


    /*
    struct ListNode {
        int val;
        struct ListNode *next;
        ListNode(int x) : val(x), next(NULL) {}
    };*/
    class Remove {
    public:
        bool removeNode(ListNode* pNode) {
            // write code here
            if(pNode->next==NULL)
                return false;
            ListNode *t = pNode->next;
            pNode->val=t->val;
            pNode->next=t->next;
            free(t);
            return true;
        }
    };


    展开全文
  • 从链表里删除一个节点 node 的最常见方法是修改之前节点的 next 指针,使其指向之后的节点。 因为,我们无法访问我们想要删除的节点之前的节点,我们始终不能修改节点的 next 指针。但是,我们可以把想要删除的...

    1.题目描述

    请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点。传入函数的唯一参数为 要被删除的节点 。
    现有一个链表 – head = [4,5,1,9],它可以表示为:
    在这里插入图片描述

    2.思路

    方法:与下一个节点交换
    从链表里删除一个节点 node 的最常见方法是修改之前节点的 next 指针,使其指向之后的节点。

    在这里插入图片描述
    因为,我们无法访问我们想要删除的节点之前的节点,我们始终不能修改该节点的 next 指针。但是,我们可以把想要删除的节点的值替换为它后面节点中的值,然后删除它之后的节点。
    在这里插入图片描述
    因为我们知道要删除的节点不是列表的末尾,所以我们可以保证这种方法是可行的

    3.代码

    /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     ListNode *next;
     *     ListNode(int x) : val(x), next(NULL) {}
     * };
     */
    class Solution {
    public:
        void deleteNode(ListNode* node) {
            node->val = node->next->val;
            node->next = node->next->next;
        }
    };
    

    4.复杂度分析

    时间复杂度:O(1)
    空间复杂度:O(1)

    展开全文
  • 修改

    2019-08-20 16:24:36
    如果某个点p没有了子节点,辣么我们需要将点p的子节点指向p的失败指针的子节点,这样是为了当穷途末路到达模式串的末尾时,就可以到一个可以查找的地方 值得注意的就是,如果一个点x,他的儿子son,x的失败指针为j...
  • 如有不足之处,敬请指出!...单链表如果在查询某个节点的前驱时需要从头开始访问,这样会很麻烦,时间复杂度为o(n), 倘若单链表的节点有个指针能够指向该节点的前驱,那么这样访问前驱时就很方便...
  • 对于双链表,增加新的节点或者删除某个节点十分非常方便的,只需要修改所在相关节点前后节点的指针指向就可以了。所以对于双链表中的任何一个节点都有着三个元素:上一个节点的指针,下一个节点的指针以及当前节点所...
  • 一、双向链表(double linked list)如图26.5,是在单链表的每个结点中,再设置一个指向其前驱结点的指针域。...链表的delete操作需要首先找到要摘除的节点的前趋,而在单链表中找某个节点的前趋需要从表头开始
  • 算法题-链表相关

    2020-03-13 09:56:00
    删除链表中的节点 题目:请编写一个函数,使其可以删除某个链表中给定的(非末尾)...既然无法通过修改指针完成,那么肯定要修改链表节点的值了。 将删除节点node的值和指针都改为下一个节点nex的值和指针即可。 cl...
  • 1.复杂链表的复制 ...在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/
  • 所谓访问就是对各结点的数据域中的值进行修改运算输出等 例如编写函数顺序输出链表中各结点数据域中的内容顺序输出链表的算法比较简单只需利用一个工作指针(p)从头到尾依次指向链表中的每个结点当指针指向某个结点时...
  • 单链表即线性表的链式存储结构,也叫线性链表。...2)要删除某个位置的节点,可以通过修改节点的前驱节点指针域和该节点指针域相同,这样其前驱节点将会直接指向下一个节点(当然,删除之后要调用fr...
  • CAS的基本使用模式:在更新某个值时存在不确定性,以及在更新失败时...有两个指针指向尾部的节点:当前最后一个元素的next指针,以及尾节点。当成功地插入一个新元素时,这两个指针都需要采用原子操作来更新。  这
  • 1:编写一个代码断,已知某节点指针,求从该节点开始,沿着链接最终可以到达不同的节点数,要求不修改任何的节点,使用的额外内存空间不多于某个常量。 2:在1的条件下,编写一个函数,沿着两个已知的链接...
  • 一、双向链表(double linked list)如图26.5,是在单链表的每个结点中,再设置一个指向其前驱结点的指针域。双向链表的基本操作与...链表的delete操作需要首先找到要摘除的节点的前趋,而在单链表中找某个节点的前
  • 二叉搜索树和双向链表:输入一棵二叉搜索树...那么如果采用中序遍历,遍历到某个节点,要处理它的时候,就说明它的左子树已经处理好了,那么就可以修改它的左孩子指针,但是其右子树还没有遍历,所以还不可以修改它...
  • 一、双向链表(double linked list)如图26.5,是在单链表的每个结点中,再设置一个指向其前驱结点的指针域。...链表的delete操作需要首先找到要摘除的节点的前趋,而在单链表中找某个节点的前趋需要从表头开始...
  • 如下图所示,文件表项是用于描述文件当前被某个进程打开后的状态信息,包括文件状态标志,记录当前文件读取的位移量(可以通过接口lseek设置),以及文件的i节点指针(i节点描述文件的具体信息,如:创建,修改时间...
  • 如下图所示,文件表项是用于描述文件当前被某个进程打开后的状态信息,包括文件状态标志,记录当前文件读取的位移量(可以通过接口lseek设置),以及文件的i节点指针(i节点描述文件的具体信息,如:创建,修改时间...
  • STL:set详解

    2017-05-09 10:14:21
    插入和删除操作效率较高,因为只需要修改相关指针而不用进行数据的移动。 删除set的数据时,实际的操作是删除红黑树中的一个节点,然后相关指针做相关调整。指向其他元素的迭代器还是指向原位置,并没有改变,所以...
  • 链表ADT实现

    2016-08-16 22:29:03
    它是通过“链”来建立逻辑关系的,因此在对链表进行插入,删除操作时不需要移动元素,而只需要修改指针即可。  链表分类:按是否包含指向前继的指针可分为单链表和双向链表;按是否成环状可以分为循环链表和非循环...
  • 如下图所示,文件表项是用于描述文件当前被某个进程打开后的状态信息,包括文件状态标志,记录当前文件读取的位移量(可以通过接口lseek设置),以及文件的i节点指针(i节点描述文件的具体信息,如:创建,修改时间...
  • 搜索总结 (更新中)

    2021-01-22 09:38:31
    在这过程中必须设定一个指针指向你搜索到了那一层,以此来判断是否到了叶子节点。必须掌握模板题,对于不同题目在模板题代码基础上进行修改。一般与DFS结合的题目有以下几个内容 DFS与解的个数 八皇后问题就是这类...
  • 可我找不到任何方法来声明这样的函数——感觉我需要一个返回指针的函数,返回的指针指向的又是返回指针的函数……,如此往复,以至无穷。 数组大小 1.23 能否声明和传入数组大小一致的局部数组,或者由其他参数指定...
  • 《你必须知道的495个C语言问题》

    热门讨论 2010-03-20 16:41:18
    可我找不到任何方法来声明这样的函数——感觉我需要一个返回指针的函数,返回的指针指向的又是返回指针的函数……,如此往复,以至无穷。 12  数组大小 13 1.23 能否声明和传入数组大小一致的局部数组,或者由...

空空如也

空空如也

1 2
收藏数 37
精华内容 14
关键字:

修改指针指向某个节点