举例:
有ai-1这个元素的指针的时候,我们怎么找到ai+1的指针?通过如下方式
先用指针p指向ai-1,ai的结点是p->next,然后(p->next)->next,然后找到了ai+1的指针,把他赋值给指针p的next域
这个是删除算法最重要的一步
怎样把不要的第i个元素删除呢?直接修改i-1这个结点的指针域,改成他的后继结点的后继结点。然后这个指针直接指向后继结点的后继结点。
那再总结一遍,怎么操作:首先找到后继结点p-next,他的next域存了ai+1,我们把ai+1的地址赋值给指针变量p所指的这个next域
又用一个指针q,这里把ai释放了,也是需要把它在哪里事先记住,修个了这个指针以后,他的地址就没了。如果不事先记住的话,就找不到ai结点了,所以需要另外一个变量q
具体算法如下:
这个e是我们删除以后的结点,他的值如果需要的话,要通过这个变量保存起来
删除元素后的新链表仍要通过新链表L返回,所以要返回的是链表,一个是删除元素的值,所以他们两个我们使用引用型变量
我们需要三个变量。这里漏了个q
第一步,找到删除结点的前驱是i-1,用p指向i-1,这里又是查找第i-1个结点
接下来如果你要删除第0个或者大于n,你都没法删,值不合理。要么太大要么太小
q指向我们要删除的结点,怎么指向呢?就是他的前驱的下一个结点,
所以q=p->next
,p指针指向我们要删除的这个结点的前驱i-1
然后是关键一步,修改指针:
将我们要删除结点的前驱,就是p指针所指的这个结点p->next,修改他的next域,变成他的后继结点,我们可以用(p->next)->next,也可以用q->next.就是ai+1的地址在q的next域里存着,所以直接p->next=q->next
再用e保存删除结点的数据域的值,然后将q结点删除,结束
总结几个重要操作:
1.将ai+1连接到ai-1,即要删除结点的前一个结点
2.需要找到他的前驱
3.删除le'de可以直接delete删了