积累基本的写代码方式,其实都大同小异
王道、天勤、算法1800题、中选择
【day01】在带头节点的链表中,删除所有值为X的结点,并释放空间。
假设值为X的结点不唯一,试编写算法一实现上述操作。
算法思路:
a.首先找到x结点,再找到X的前驱结点,才有可能删除它。
b.通常需要3个指针:
pre:指向前驱
p:遍历整条链表
q:指向当前找到的X结点
代码:
viod Del_X(LinkList *L,Elemtype *p)
//这里需要加取地址符,如果题目只需要查找链表中的值,并不改变链表的值,这里可以不加上取地址符。
//p的结点写成Elemtype类型,是因为结点中的Date域的值并不确定
LNode *p = L->next, *pre = L, *q; //首先将指针初始化一下
//p指针指向头结点的下一个指针
//pre指针是用来寻找他的前驱,现在指向头结点
//*q的作用是标记找到的结点
while(p != NULL){ //首先利用p结点遍历整条链表,判断是否为空链表
if (p -> data == x){ //如果P指针的date域是我们要找的X
q = p; //p结点的地址赋值给q
p = p->next; //p向后移一位
pre->next = p; //防止断链,pre需要指向此时的p
free(q);
}
else{ //没找到就需要
pre = p;
p = p->next;
}
}