问题描述
试着编写在带头结点的单链表L中删除一个最小值结点的高效算法(假设最小值结点是唯一的)
问题分析:
对于这道题我最先想到的就是遍历整个链表,使用两个指针min和mov,将这两个指针指向结点的数据进行比较,然后将min指针指向小的一方,mov指针移动到下一个结点,但是得到了最小的结点后我们怎么删除他呢,链表删除当前结点你得知道删除结点的前驱结点,然后让前驱结点的next指针指向删除结点的后继结点,这里我用了一个方法,那就是:
LNode *p = min->next;
min->data = min->next->data;
min->next = min->next->next;
free( p );`
如上述代码我们可以知道,我们将后继节点的值赋予到本来要删除的结点,然后删除他的后继节点,也就是删除了我们要删除的结点,但是这种方法又给我们带来了一个问题,那就是如果最小值在最后一个结点怎么办?直接把结点free掉吗?在单链表中,直接free掉最后一个结点,如果不修改它的前趋结点的next值,会发生访问一个已释放的内存。可能会发生不可预料的出错。有的系统会直接中止程序运行。因为最后一个结点的后继节点是NULL,所以我们的data自然也是没有的。所以这时候我们就要加一个判断条件对最后一个结点是否最小进行单独判断。
解决方案:
代码如下
#include <iostream>
using namespace std;
// 链表节点
typedef struct LNode {
int data;
LNode *next;
}LNode,*LinkList;
// 尾插法
void List_TailInsert