1.用遞迴演算法,刪除帶結點的單鏈表l中所有值為x的結點。
由於是帶頭結點的,所以並且查詢值為x的結點時,從l->next的值開始判斷,
如果l->next的data等於x,那麼就要將l->next的值刪除並且將l的後繼結點換成l->next的後繼結點,並且將它刪除。
lnode *p = l->next ;
l->next=l->next->next;
free(p)
遞迴模型:
終止條件:
l->next == null
遞迴主體:
如果l->next->data= = x:
刪除l->next結點,並執行l->next=l->next->next操作,繼續執行下乙個結點值判斷。
如果l->next != x:
直接判斷下乙個結點。
lnode* delectlist(lnode*l, int x)
else}}
2.在頭結點的單鏈表,編寫演算法實現從尾到頭反向輸出每個結點的值。
第一種:
反向輸出,可以頭結點的後繼結點開始,直到l->next=null,用頭插法的方式將後面的結點插在頭結點後面,然後在依次列印。
第二種:
棧是一種後進先出的結構,遞迴就是用棧的思想實現的。
void r_print(lnode *l)
cout << l->data << endl;
}
3.將帶頭結點的鍊錶就地逆置(就地要求輔助空間複雜度為o(1))。
其實這幾道題的思想都差不多,這道題就是將頭結點取下然後將後續結點用頭插法的方式插入,直到最後乙個結點。
lnode* reverse_l(lnode *l)
return l;
}
4.將帶頭結點的鍊錶刪除最小值結點的高效演算法(最小結點唯一)
思路:第一步尋找最小值
第二步將最小值刪除
在尋找最小值時用需要從頭到尾一次比較,將最小值的前驅用指標儲存。
刪除時只需要將前驅的後繼結點指向改變即可。
空間複雜度為o(1),時間複雜度為o(n)
lnode* deletemin(lnode *l)
move = move->next;
} lnode *s = min->next;//要刪除的結點
min->next = min->next->next;//前驅結點的後繼結點改變
free(s);
return l;
}
全部**:
/*
instruction:linklist insertion
author:huangpingyi
date:2017/02/23
*/#include using namespace std;
struct lnode
;//尾插法
lnode* createlistt(lnode *l, int x, int array)
return q;
}//遞迴刪除值為x的結點
lnode* delectlist(lnode*l, int x)
else
}}//從頭到尾反向輸出結點
void r_print(lnode *l)
cout << l->data << endl;
}//就地逆置鍊錶
lnode* reverse_l(lnode *l)
return l;
}//刪除鍊錶中最小值結點
lnode* deletemin(lnode *l)
move = move->next;
} lnode *s = min->next;//要刪除的結點
min->next = min->next->next;//前驅結點的後繼結點改變
free(s);
return l;
}//列印結果
void print(lnode *l)
}int main()
lnode* l = new lnode;
createlistt(l, x, array);//d呼叫後為啥l不變
cout << "用尾插法建立鍊錶的結果:" << endl;
print(l);
int delect;
cout << "請輸入需要刪除的數" << endl;
cin >> delect;
delectlist(l, delect);
cout << "用遞迴法刪除x後結果" << endl;
print(l);
cout << "從頭到尾反向輸出結果" << endl;
r_print(l->next);
cout << "此時鍊錶的順序" << endl;
print(l);
reverse_l(l);
cout << "就地逆置後的結果:" << endl;
print(l);
cout << "刪除結點的最小值結果" << endl;
deletemin(l);
print(l);
system("pause");
return 0;
}
執行效果:
單鏈表的常見基礎演算法(二)
1 求單鏈表中的乙個最小值 2 單鏈表逆置 3 l為帶頭結點的單鏈表,實現從尾到頭反向輸出每個結點值 4 遞迴刪去不帶頭結點的單鏈表中所有值為x的結點 5 無序鍊錶中刪除所有值為x的結點並釋放其空間 6 帶頭結點的單鏈表中刪除所有介於給定的兩個值之間的元素 7 帶頭結點的單鏈表中刪除乙個最小值結點 ...
常見演算法 反轉單鏈表
使用3個指標,分別指示當前節點,當前節點的前乙個節點,以及後乙個節點。初始化前乙個節點為空。當節點個數大於1時,每遍歷乙個節點,更新它的next指標指向前乙個節點。同時更新前乙個節點和後乙個節點。直至當前節點指標為空,返回前乙個節點的指標。include using namespace std st...
演算法進行時 單鏈表(一)頭尾插法
鍊錶應該是當時學資料結構用得最多的了,面試的話考它的也多,它用的指標的時候也多,but 資料結構學了一年多了,差不多的都忘記了,打算開始複習一遍,畢竟靠它買 哈哈。鍊錶第一題first 鍊錶中首先開始學的最多就是用頭插法和尾插法 頭插法 每次都從頭開始插入結點。cout 用頭插法的結果 endl p...