① 如何删除一个链表的节点
将这个指针指向的next节点值到本节点,将next指向next->next,并随后删除原next指向的节点。
class node
{
public:
node(int x) : data(x), next(0){}
int data;
node* next;
};
void DelNode(node* pDel)
{
node* pTemp = pDel->next;
memcpy(pDel, pTemp, sizeof(node));
pDel->next = pTemp->next;
delete pTemp;
}
② 数据结构(c语言版)中的删除链表中的一个节点
代码如下:
#include <stdio.h>
#include <stdlib.h>
typedef struct List
{
int a;
List* next;
}list;
void newList(list* l)//创建结点
{
list* a[4];
for (int i = 0; i < 4; i++)
{
a[i] = (list*)malloc(sizeof(list));
a[i]->a = i+1 ;
}
l->next = a[0];
a[0]->next = a[1];
a[1]->next = a[2];
a[2]->next = a[3];
a[3]->next = NULL;
}
void printfList(list* l)//打印结点的数据内容
{
printf("该链表的内容是: ");
while (l->next)
{
printf("%d ", l->next->a);
l = l->next;
}
printf(" ");
}
void setList(list* l,int x,int y)
{
list* head = l;
l = l->next;
while (l)
{
if (l->a >=y || l->a <=x)//将结点的数据区与指定区域进行比较
{
head->next = l;//将满足条件的结点连接在新表的最后一个结点
//指针后移
l = l->next;
head = head->next;
}
else
{
//不满足的结点进行删除
list* l1 = l;
l = l->next;
free(l1);
}
}
head->next = NULL;
}
int main()
{
list* l = (list*)malloc(sizeof(List));
newList(l);//初始化链表
printfList(l);//输出旧表内容
setList(l,1,3);//进行修改
printfList(l);//输出修改后的链表
//system("pause");
return 0;
}
(2)如何删除散列链表中的末位节点扩展阅读
链表的特点
1、插入、删除数据效率高,时间复杂度为O(1)级别(只需更改指针指向即可),随机访问效率低,时间复杂度O(n)级别(需要从链头至链尾进行遍历)。
2、和数组相比,内存空间消耗更大,因为每个存储数据的节点都需要额外的空间存储后继指针。
常用的链表类型
1、单链表
1)每个节点只包含一个指针,即后继指针。
2)单链表有两个特殊的节点,即首节点和尾节点。用首节点地址表示整条链表,尾节点的后继指针指向空地址null。
3)性能特点:插入和删除节点的时间复杂度为O(1),查找的时间复杂度为O(n)。
2、循环链表
1)除了尾节点的后继指针指向首节点的地址外均与单链表一致。
2)适用于存储有循环特点的数据,比如约瑟夫问题。
3、双向链表
1)节点除了存储数据外,还有两个指针分别指向前一个节点地址(前驱指针prev)和下一个节点地址(后继指针next)。
2)首节点的前驱指针prev和尾节点的后继指针均指向空地址。
③ 关于链表尾节点的删除操作
问题出现在查找效率上
链表最常用的操作是在末尾插入节点和删除尾节点
在尾巴插入删除操作:
都需要知道他的前导而单链表要查找到最有一个元素需要遍历全部链表
双链表直接可以查到前导
最常用的操作实在最后一个元素之后插入一个元素和删除第一个元素
删除头结点需要头指针或者只用一个->next域就能查到速度就快了
在有第二个条件删除最后一个元素有尾指针就最好了可以直接找到尾巴元素同时他还是循环链表所以正好他的->next就是头结点
ok?
④ python链表怎么删除最后一个元素
def DelLastChar(str):
str_list=list(str)
str_list.pop()
return "".join(str_list)
new_str=DelLastChar("abcdx")
print new_str
最后两行是测试,这个函数的作用就是删除字符串的最后一个字符。
思路就是,将字符串打散为一个list,然后pop出这个list的最后一个元素,然后再将这个list,整合join为一个字符串。
⑤ c语言中删除链表中的一个节点
temp=p;
p=p->next;
temp->next=NULL;
这三句存在问题,temp=p,让temp指向p所指向的节点,p=p->next,p指向后移
temp->next=NULL,让temp的后继为空,这里出了问题,链表从temp指向的节点断开,相当于删除p之后的所有节点。
应该先判断p是不是最后节点
if(p->next==NULL)
如果是,只好去找p的前趋pre,让pre->next=NULL,free(p)
如果不是最后节点,将p的后继节点数值域复制给p,然后将p的后继节点删除,等同与删除p
p->data=p->next->data;
p->next=p->next->next;
free(p);
⑥ 如何删除双链表的最后一个节点
是双向链表吗?,是的话就简单了,移动到链表最后一个节点,记住节点,然后移动到上一个节点,把上一个节点的next改为NULL, 如果有tail指针,修改tail指向上一个节点,然后释放最后一个节点就行了
⑦ 若某链表中最常用的操作是在最后一个结点之后插入一个结点和删除最后一个结点,
选D。某线性表中最常用的操作是在最后一个元素之后插入一个元素和删除第一个元素,则采用仅有尾指针的单循环链表存储方式最节省运。
仅有尾指针的单循环链表,可以非常方便地找到尾结点,尾结点后面的第一个结点往往是头结点,头结点的下一个结点就是第线性表的第一个结点。对最后一个元素和第一个元素操作对带尾指针的单循环链表是非常方便的。
(7)如何删除散列链表中的末位节点扩展阅读:
使用只有表尾指针没有表头指针:
循环单链表指的是最后节点的指针域指向表头节点,如果要删除第一个元素,只需要通过表尾指针找到第二个节点,然后将最后节点的指针指向第二个节点,就将第一个元素删除了;最后一个元素后面插入新元素时,先找到表头,将新元素的指针域指向表头,然后再将表尾指向新元素就好了。
单链表指的是最后节点的指针域指向表头节点,如果要删除最后一个元素,必须遍历整个链表才能找到表尾,进行新元素的插入、再插入时的算法复杂度为O(n)。
⑧ c语言结构体链表的节点删除问题 求助大佬
这个出错点在行 while() 循环之后的那一句: free(l->tail); 第一段程序,其实在 while() 循环里面已经把全部节点都释放了,包括尾节点,所以第一段程序不需要再释放一次 l->tail,只需要保留 l->tail = NULL; 即可。 第二段程序,因为最后一个...
2019-10-14回答者:隐世高手0074个回答
c语言中删除链表指定节点的一些问题?
问:struct student *Del (struct student *head, int num) { struct studen...
答:你仔细看看 while (p1->num != num && p1->next != NULL) 这一句之前的代码 p2什么时候赋值过? 而且if (p2 == head) //如果要删除的节点是第一个节点 既然是第一个节点,那么 while (p1->num != num && p1->next != NULL) 这个循环一次都没有执...
2015-10-20回答者:知道网友1个回答2
C语言数据结构的链表删除与查找问题~~,实在是被弄...
问:#include "stdlib.h" #include "stdio.h" typedef struct node{ //链表...
答:#include #include typedef struct LNode {char character; struct LNode*next; }LNode,*PLNode; PLNode CreateList()/*创建单链表*/ {PLNode P,head,q; int i; head=(PLNode)malloc(sizeof(LNode)); p=head; p->next=NULL; for(i=0;icharacter=...
2010-11-25回答者:qjbrh532个回答
C语言删除链表结点 结点结构如下
问:#define ELEMTYPE char typdef struct node { ELEMTYPE date; struct no...
答:我提供思路哈,你自己写一下,这个不难的。 分为两种情况: 1、删除的是头结点,这又可以分为两种情况:a)若是链表只有一个头结点,那么删除后头结点为NULL;b)若是链表不止一个节点,那么head指针指向头结点下一个节点。两种情况都要free 之...
⑨ 如何在o时间删除链表节点
算法思路:
一般我们是从头节点开始遍历,知道找到要删除的节点的前面一个节点,但是时间复杂度为O(n)
改进思路:找到要删除的节点pDeleteNode的下一个节点pNext,把下一个节点的值(pNext->m_nValue)
赋给要删除的节点(PDeleteNode->m_nValue),再把要删除的节点指向下一个节点的下一个节点:(pDelete->m_pNext = pNext->m_pNext)
然后再把pNext节点删除,pNext = NULL;
代码:
[cpp] view plain print?
// DeleteNodeInList.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include<iostream>
using namespace std;
/*
算法思路:
一般我们是从头节点开始遍历,知道找到要删除的节点的前面一个节点,但是时间复杂度为O(n)
改进思路:找到要删除的节点pDeleteNode的下一个节点pNext,把下一个节点的值(pNext->m_nValue)
赋给要删除的节点(PDeleteNode->m_nValue),再把要删除的节点指向下一个节点的下一个节点:(pDelete->m_pNext = pNext->m_pNext)
然后再把pNext节点删除,pNext = NULL;
*/
struct ListNode
{
int m_nValue;
ListNode* m_pNext;
};
void DeleteNode(ListNode** pListHead, ListNode* pToBeDeleted)
{
if (!pListHead || !pToBeDeleted)
{
return;
}
if (pToBeDeleted->m_pNext != NULL)//删除的节点不是尾巴节点
{
ListNode* p = pToBeDeleted->m_pNext;
pToBeDeleted->m_nValue = p->m_nValue;
pToBeDeleted->m_pNext = p->m_pNext;
delete p;
p = NULL;
}
else if (*pListHead == pToBeDeleted)//链表只有一个节点,删除头节点也是尾巴节点
{
delete pToBeDeleted;
pToBeDeleted = NULL;
*pListHead = NULL;
}
else//链表中有多个节点,删除尾巴节点
{
ListNode* pNode = *pListHead;
while (pNode->m_pNext != pToBeDeleted)
{
pNode = pNode->m_pNext;
}
pNode->m_pNext = pToBeDeleted->m_pNext;
delete pToBeDeleted;
pToBeDeleted = NULL;
}
}
/*
分析: 对于n-1个非尾巴节点而言,我们可以在O(1)的时间把下一个节点的内存复制覆盖要删除的节点,并删除下一个节点;
对于尾巴节点而言,由于仍然需要顺序查找,时间复杂度是O(n).因此总的平均时间复杂度是[(n-1)*O(1)+O(n)]/n,因此平均时间
复杂度是O(1);
*/
int _tmain(int argc, _TCHAR* argv[])
{
return 0;
}
对于n-1个非尾巴节点而言,我们可以在O(1)的时间把下一个节点的内存复制覆盖要删除的节点,并删除下一个节点;
对于尾巴节点而言,由于仍然需要顺序查找,时间复杂度是O(n).因此总的平均时间复杂度是[(n-1)*O(1)+O(n)]/n,
因此平均时间复杂度是O(1);