① 如何刪除一個鏈表的節點
將這個指針指向的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);