Leetcode 707.设计链表
傳送門:力扣
答案在文后/
在鏈表類中實(shí)現(xiàn)這些功能:
get(index):獲取鏈表中第?index?個(gè)節(jié)點(diǎn)的值。如果索引無效,則返回-1。
addAtHead(val):在鏈表的第一個(gè)元素之前添加一個(gè)值為?val?的節(jié)點(diǎn)。插入后,新節(jié)點(diǎn)將成為鏈表的第一個(gè)節(jié)點(diǎn)。
addAtTail(val):將值為?val 的節(jié)點(diǎn)追加到鏈表的最后一個(gè)元素。
addAtIndex(index,val):在鏈表中的第?index?個(gè)節(jié)點(diǎn)之前添加值為?val??的節(jié)點(diǎn)。如果?index?等于鏈表的長度,則該節(jié)點(diǎn)將附加到鏈表的末尾。如果 index 大于鏈表長度,則不會(huì)插入節(jié)點(diǎn)。如果index小于0,則在頭部插入節(jié)點(diǎn)。
deleteAtIndex(index):如果索引?index 有效,則刪除鏈表中的第?index 個(gè)節(jié)點(diǎn)。
?
示例:
MyLinkedList linkedList = new MyLinkedList();
linkedList.addAtHead(1);
linkedList.addAtTail(3);
linkedList.addAtIndex(1,2); ? //鏈表變?yōu)?-> 2-> 3
linkedList.get(1); ? ? ? ? ? ?//返回2
linkedList.deleteAtIndex(1); ?//現(xiàn)在鏈表是1-> 3
linkedList.get(1); ? ? ? ? ? ?//返回3
?
提示:
所有val值都在?[1, 1000]?之內(nèi)。
操作次數(shù)將在??[1, 1000]?之內(nèi)。
請不要使用內(nèi)置的 LinkedList 庫。
涉及:虛擬頭節(jié)點(diǎn)的建立。
在之前的移動(dòng)鏈表位置的文章中,鏈表移除元素復(fù)盤_BanTanger的博客-CSDN博客,使用的方法是移動(dòng)head節(jié)點(diǎn)的方法來移除元素,但這種方法需要做一個(gè)是否移除元素屬于頭節(jié)點(diǎn)的判斷,這里通過虛擬頭節(jié)點(diǎn)_dummyNode的設(shè)置,可以很簡單的移除元素
詳細(xì)代碼:
#include<iostream> using namespace std;class MyListNode { public:struct ListNode {int val;ListNode* Next;ListNode(int v) :val(v), Next(NULL) {}};//鏈表的初始化MyListNode(){_dummyHead = new ListNode(0);_size = 0;}//獲取到第index個(gè)節(jié)點(diǎn)數(shù)值,如果index是非法數(shù)值直接返回-1, 注意index是從0開始的,第0個(gè)節(jié)點(diǎn)就是頭結(jié)點(diǎn)int get(int index) {if (index > (_size - 1) || index < 0) {return -1;}ListNode* cur = _dummyHead->Next;while (index--) { // 如果--index 就會(huì)陷入死循環(huán)cur = cur->Next;}return cur->val;}//頭節(jié)點(diǎn)插入元素void AddOfHead(int val) {ListNode* newNode = new ListNode(val);newNode->Next = _dummyHead->Next;_dummyHead->Next = newNode;_size++;}//尾節(jié)點(diǎn)插入元素void AddOfTail(int val) {ListNode* newNode = new ListNode(val);ListNode* current = _dummyHead;while (current->Next != NULL) {current = current->Next;}current->Next = newNode;//這里因?yàn)樵跇?gòu)造函數(shù)中已經(jīng)構(gòu)造出節(jié)點(diǎn)默認(rèn)指向是NULL,所以可以不用像C那樣寫出指向NULL_size++;}//索引添加元素void AddOfIndex(int index, int val) { //index合法性檢驗(yàn)if (index > _size) {return;}ListNode* newNode = new ListNode(val);ListNode* current = _dummyHead;//將current節(jié)點(diǎn)指向虛擬頭節(jié)點(diǎn),達(dá)到index==0時(shí)插入的元素在頭節(jié)點(diǎn)之后。while (index--) {current = current->Next;}newNode->Next = current->Next;current->Next = newNode;_size++;}//刪除操作void deleteIndex(int index) {//對刪除的位置判斷if (index > _size || index < 0) {return;}ListNode* current = _dummyHead;while (index--) {current = current->Next;}ListNode* tmp = current->Next;current->Next = current->Next->Next;delete tmp;_size--;}//打印鏈表void PrintListNode() {ListNode* current = _dummyHead;while (current->Next != NULL) {cout << current->val << " ";current = current->Next;}cout << endl;} private:int _size;ListNode* _dummyHead; };總結(jié)
以上是生活随笔為你收集整理的Leetcode 707.设计链表的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python numpy sum函数,n
- 下一篇: 公文字体字号标准2020_手把手教你写公