更新
今天发现,只有递归时才能用下面的方法直接对链表节点进行修改,因为递归时不会不停地lnode->next,而是通过函数调用fuc(lnode->next),但普通循环时,不断地lnode->next,会使其不断的变化。
以下是原文章
我们都知道c++中函数有&引用,今天学数据结构的链表时发现一个问题。链表是有数据域和指针域的,如果一个函数的参数包含链表节点,并且是引用调用的时候,对链表节点的修改会改变链表本身,这是肯定的,这是引用调用的作用。但是有一个问题我之前没有弄清楚,就是某一个链表节点lnode,肯定是有前驱节点的,前驱节点的next指针是指向当前这个lnode的首地址的,但是将lnode修改时,比如lnode = lnode->next,此时看似只是改变了lnode,其前驱节点的next指针好像还是指向原来的地址,因为根本没有涉及到前驱节点的next指针。
但是我在vs2019里试了一下,用单步调试,观察整个链表,发现在lnode = lnode->next之后,其前驱节点的next会随之改变为lnode->next的首地址,也就是说lnode本身修改时,其前驱节点会跟着next过去,而不是指向原来的地址,而原来的地址还是存在的,只不过不会指过去。所以如果要删除某个节点,可以令一个新的节点p = lnode,然后对lnode进行操作,之后直接free(p),就会将之前的lnode直接删掉了。