设计链表的实现。您可以选择使用单链表或双链表。单链表中的节点应该具有两个属性:val
和 next
。val
是当前节点的值,next
是指向下一个节点的指针/引用。如果要使用双向链表,则还需要一个属性 prev
以指示链表中的上一个节点。假设链表中的所有节点都是 0-index 的。
在链表类中实现这些功能:
- get(index):获取链表中第
index
个节点的值。如果索引无效,则返回-1
。 - addAtHead(val):在链表的第一个元素之前添加一个值为
val
的节点。插入后,新节点将成为链表的第一个节点。 - addAtTail(val):将值为
val
的节点追加到链表的最后一个元素。 - addAtIndex(index,val):在链表中的第
index
个节点之前添加值为val
的节点。如果index
等于链表的长度,则该节点将附加到链表的末尾。如果index
大于链表长度,则不会插入节点。如果index
小于0,则在头部插入节点。 - deleteAtIndex(index):如果索引
index
有效,则删除链表中的第index
个节点。
示例:
MyLinkedList linkedList = new MyLinkedList(); linkedList.addAtHead(1); linkedList.addAtTail(3); linkedList.addAtIndex(1,2); //链表变为1-> 2-> 3 linkedList.get(1); //返回2 linkedList.deleteAtIndex(1); //现在链表是1-> 3 linkedList.get(1); //返回3
1 struct Listnode{ 2 int val; 3 Listnode* next; 4 Listnode() : val(0), next(nullptr) {} 5 Listnode(int x) : val(x), next(nullptr) {} 6 Listnode(int x, Listnode* next) : val(x), next(next) {} 7 }; 8 class MyLinkedList { 9 struct Listnode* head; 10 int size; 11 public: 12 MyLinkedList() { 13 head = new Listnode(); 14 size = 0; 15 } 16 17 int get(int index) { 18 if(index> size-1||index<0) return -1; 19 Listnode* cur = head; 20 for(int i = 0; i <= index ; i++ ) 21 { 22 cur = cur->next; 23 } 24 return cur->val; 25 } 26 27 void addAtHead(int val) { 28 Listnode* cur = head->next; 29 Listnode* dummy_head = new Listnode(val,cur); 30 head->next = dummy_head; 31 size++; 32 return; 33 } 34 35 void addAtTail(int val) { 36 Listnode* cur = head; 37 while(cur->next) 38 { 39 cur = cur->next; 40 } 41 Listnode *newnode = new Listnode(val); 42 cur->next = newnode; 43 size++; 44 return; 45 } 46 47 void addAtIndex(int index, int val) { 48 Listnode* cur = head; 49 if(index>size) return; 50 if(index<0) 51 { 52 addAtHead(val); 53 return; 54 } 55 if(index==size) 56 { 57 addAtTail(val); 58 return; 59 } 60 for(int i = 0; i < index; i++) 61 { 62 cur = cur->next; 63 } 64 Listnode* newnode = new Listnode(val,cur->next); 65 cur->next = newnode; 66 size++; 67 return; 68 } 69 70 void deleteAtIndex(int index) { 71 if(index<0||index>size-1) return; 72 Listnode* pre = head; 73 for(int i = 0; i <index; i++) 74 { 75 pre = pre->next; 76 } 77 Listnode* cur = pre->next; 78 pre->next=cur->next; 79 delete cur; 80 size--; 81 return; 82 } 83 }; 84 /** 85 * Your MyLinkedList object will be instantiated and called as such: 86 * MyLinkedList* obj = new MyLinkedList(); 87 * int param_1 = obj->get(index); 88 * obj->addAtHead(val); 89 * obj->addAtTail(val); 90 * obj->addAtIndex(index,val); 91 * obj->deleteAtIndex(index); 92 */
标签:index,Listnode,cur,val,707,next,链表,设计 From: https://www.cnblogs.com/lihaoxiang/p/16978191.html