单链表删除结点后为什么原前驱结点和原后继结点间没有断链?
rt,附上代码。题目是设计一个通过递归调用,实现删除不带头结点的单链表L中所有值为X的结点
假设输入1 2 3 1 4 5,删除“1”的结点,那么采用头插法生成的链表为5 4 1 3 2 1,首先要删除序号为3的“1”结点
我认为为此应该执行之前所学的4步操作:
(1)找到“1”的前驱结点“4”,赋值给结点s
(2)令结点p指向s的后继结点,也就是“1”
(3)令s指向p的后继结点,也就是“3”
(4)释放p的空间
可是题目答案的操作只有(1)(2)(4),并且在书上有专门解释是“有读者认为直接去掉p结点会造成断链,实际上因为L为引用,是直接对原链表进行操作,因此不会断链”
我并不能完全理解为什么不会发生断链,所以发帖询问
答案所示即为delectX函数内容,问题代码在delectX()中的注释部分
程序代码:
#include <iostream> using namespace std; typedef struct LNode { int data; struct LNode* next; }LNode,*LinkList; LinkList createList() { int x; LinkList l = (LinkList)malloc(sizeof(LNode)); //head LNode* s; l->next = NULL; cin >> x; do { s = (LNode*)malloc(sizeof(LNode)); s->data = x; s->next = l->next; l->next = s; cout << "add new data " << s->data << endl; cin >> x; } while (x > 0); return l; } void dis(LinkList l) { l = l->next; while (l != NULL) { cout << l->data << " "; l = l->next; } cout << endl; } void delectX(LinkList &l, int x) //使用递归 { //cout << "delect" << endl; LNode* s; if (l == NULL) return; if (l->data == x) { s = l; l = l->next; //5 4 1 3 2 1 ,删除第一个1后,4与3之间没有链接了应该会断链啊? free(s); delectX(l, x); } else delectX(l->next, x); } int main() { LinkList l=createList(); dis(l); delectX(l, 1); dis(l); return 0; }
[此贴子已经被作者于2020-7-7 02:02编辑过]