单链表在不知头结点的情况下对第i个元素的删除

一、首先,看看单链表中第i个元素的删除:

Status ListDelete_L (LinkList &L,int i,ElemType &e){

//在带头结点的单链表L中,删除第i个元素,并由e返回其值

p=L;j=0;

while(p->next&&j<i-1){                     //寻找第i个结点,并令p指向其前驱

p=p->next;

++j;

}

if(!(p->next)||j<i-1)return ERROR;  //删除位置不合理

q=p->next;p->next=q->next;          //删除并释放结点

e=q->data;free(q);

return OK;

}

例如对单链表L中第3个元素C的删除,即对第4个结点删除:

1) 最开始时P指针指向头结点,j=0;

2) 执行循环语句,当j=2时,p指向第三个结点,循环结束;

3) q=p->next;p->next=q->next; 删除并释放结点;

则实现了C结点的删除。

二、单链表在不知头结点的情况下对第i个元素的删除:

例如对B结点的删除,最开始只知道指向B结点的指针q,因为是单链表,不能获取到前驱指针,所以不能用上面的方法进行删除。

可以用下面的语句实现q结点的删除:

q->data=q->next->data;

q->next=q->next->next;

此时,L单链表变为:

虽然删除的是C结点,但它把C中的数据复制到B中,相当于删除了B结点。

但要注意的是,这种删除方法不能删除位于表尾的结点,因为他的后面再没有别的结点可以替换。

时间: 2024-08-29 05:53:37

单链表在不知头结点的情况下对第i个元素的删除的相关文章

链表:在不给出整个链表头结点的情况下,删除单链表中的某个节点

问题描述: 有一个包含int型节点值的单链表,给定一个链表中的节点node,但不给定整个链表的头结点,删除链表中的某个结点. 算法实现: class Node { public int value; public Node next; public Node(int value) { this.value = value; } } public void removeWiredNode(Node node) { if(node == null) { return; } Node next = n

cc150:实现一个算法来删除单链表中间的一个结点,只给出指向那个结点的指针

实现一个算法来删除单链表中间的一个结点,只给出指向那个结点的指针. 例子: 输入:指向链表a->b->c->d->e中结点c的指针 结果:不需要返回什么,得到一个新链表:a->b->d->e 解答 这个问题的关键是你只有一个指向要删除结点的指针,如果直接删除它,这条链表就断了. 但你又没办法得到该结点之前结点的指针,是的,它连头结点也不提供.在这种情况下, 你只能另觅他径.重新审视一下这个问题,我们只能获得从c结点开始后的指针, 如果让你删除c结点后的某个结点,那

cc150:实现一个算法来删除单链表中间的一个结点,仅仅给出指向那个结点的指针

实现一个算法来删除单链表中间的一个结点,仅仅给出指向那个结点的指针. 样例: 输入:指向链表a->b->c->d->e中结点c的指针 结果:不须要返回什么,得到一个新链表:a->b->d->e 解答 这个问题的关键是你仅仅有一个指向要删除结点的指针,假设直接删除它,这条链表就断了. 但你又没办法得到该结点之前结点的指针,是的,它连头结点也不提供.在这样的情况下, 你仅仅能另觅他径.又一次审视一下这个问题,我们仅仅能获得从c结点開始后的指针, 假设让你删除c结点后的

【LeetCode-面试算法经典-Java实现】【025-Reverse Nodes in k-Group(单链表中k个结点一组进行反转)】

[025-Reverse Nodes in k-Group(单链表中k个结点一组进行反转)] [LeetCode-面试算法经典-Java实现][所有题目目录索引] 原题 Given a linked list, reverse the nodes of a linked list k at a time and return its modified list. If the number of nodes is not a multiple of k then left-out nodes i

009实现一个算法来删除单链表中的一个结点,只给出指向那个结点的指针(keep it up)

呵呵,这个题不能直接删除已知的结点,因为是单链表,不知道前驱,只知道 后继结点,直接删除会使链表断开.不过我们可以删除已知结点的后继结点, 把后继结点的值赋值给已知结点. #include <iostream> struct Node { int data; Node* next; }; bool removeNode(Node* vNode) { if (vNode == NULL || vNode->next == NULL) return false; Node* pNext =

单链表(不带头结点)

#include <stdio.h> #include <stdlib.h> typedef int ElemType; typedef struct Node { ElemType data; struct Node *next; }LNode,*LinkList; void InitList(LinkList &l); void Create_head(LinkList &l); void Create_rear(LinkList &l); void O

C实现头插法和尾插法来构建单链表(不带头结点)

链表的构建事实上也就是不断插入节点的过程.而节点的插入能够分为头插法和尾插法. 头插法就是在头结点后插入该节点,始终把该节点作为第一个节点.尾插法就是在链表的最后一个节点处插入元素,作为最后一个节点.假设想要了解链表的概念和其它链表操作.请參考<数据结构与算法之链表><C语言实现链表的基本操作>两篇文章.演示样例代码上传至  https://github.com/chenyufeng1991/HeadInsertAndTailInsert . // // main.c // Hea

链表----在链表中添加元素详解--使用链表的虚拟头结点

在上一小节中关于在链表中头部添加元素与在其他位置添加元素在逻辑上有所差别,这是由于我们在给链表添加元素时需要找到待添加元素位置的前一个元素所在的位置,但对于链表头来说,没有前置节点,因此在逻辑上就特殊一些,操作方式也就有所差别,需单独处理.为了针对头结点的操作方式与其他方式一致:接下来我们就一步一步引入今天的主题--使用虚拟头结点. 首先来看看之前的节点结构--第一个是头结点 相应的逻辑代码,感兴趣的可以看看我上一篇相关介绍,点击传送地址 为了能把关于头结点的操作与其他操作统一起来,我们来分析一

009实现一个算法来删除单链表中的一个结点,仅仅给出指向那个结点的指针(keep it up)

呵呵,这个题不能直接删除已知的结点.由于是单链表,不知道前驱,仅仅知道 后继结点,直接删除会使链表断开.只是我们能够删除已知结点的后继结点, 把后继结点的值赋值给已知结点. #include <iostream> struct Node { int data; Node* next; }; bool removeNode(Node* vNode) { if (vNode == NULL || vNode->next == NULL) return false; Node* pNext =