C++实现单链表/实现堆什么的也是面试常客了,这里就实现一下。
其实细心点写很简单,每个人的实现方式可能不一样,但是思路还是大体相同的。
我这里是用一个head来指向链表头元素,head本身无意义,方便而已。
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 //结点类结构 5 struct node{ 6 int val; 7 struct node *next; 8 }; 9 10 class LinkList { 11 private: 12 node *head; 13 public: 14 LinkList() { 15 head=new node; head->val=0; head->next=NULL; 16 } 17 ~LinkList(); 18 bool isEmpty(); //判断是否为空 19 int getLength(); //获得长度 20 void getElem(int idx,node *e); //获得指定位置的元素放在e 21 int findElem(int val); //寻找值为val的元素 22 void insertToEnd(int val); //插入到链表尾 23 void insertNode(node *e,int val); //在e点后插入一个点 24 void insertByIndex(int idx,int val); //插入到指定位置 25 void deleteNode(node *e); //删除结点e的下一个结点 26 void deleteByIndex(int idx); //删除指定位置元素 27 node* reverse(); //反转链表 28 void print(); //打印链表 29 }; 30 31 LinkList::~LinkList() { 32 while (head->next!=NULL) deleteByIndex(0); 33 delete(head); 34 } 35 36 bool LinkList::isEmpty() { 37 return head->next==NULL; 38 } 39 40 int LinkList::getLength() { 41 int len=0; node *p=head; 42 while (p->next!=NULL) { 43 p=p->next; 44 len++; 45 } 46 return len; 47 } 48 49 void LinkList::getElem(int idx,node *e) { 50 node *p=head; e=NULL; int k=0; 51 while (p->next!=NULL) { 52 p=p->next; 53 if (k==idx) e=p; 54 k++; 55 } 56 } 57 58 int LinkList::findElem(int val) { 59 int k=0; node *p=head; 60 while (p->next!=NULL) { 61 p=p->next; 62 if (p->val==val) return k; 63 k++; 64 } 65 return -1; //找不到 66 } 67 68 void LinkList::insertNode(node *p,int val) { 69 node *pre=p; 70 node *nxt=pre->next; 71 node *newNode=new node; 72 newNode->val=val; 73 newNode->next=nxt; 74 pre->next=newNode; 75 } 76 77 void LinkList::insertToEnd(int val) { 78 if (isEmpty()) insertNode(head,val); 79 else insertByIndex(getLength()-1,val); 80 } 81 82 void LinkList::insertByIndex(int idx,int val) { 83 node *p=head; idx++; 84 if (idx>getLength()) return; 85 while (idx>0) { idx--; p=p->next; } 86 insertNode(p,val); 87 } 88 89 void LinkList::deleteNode(node *e) { 90 node *pre=e->next; 91 node *nxt=pre->next; 92 e->next=nxt; 93 delete pre; 94 } 95 96 void LinkList::deleteByIndex(int idx) { 97 node *p=head; 98 if (idx>getLength()) return; 99 while (idx>0) { p=p->next; idx--; } 100 deleteNode(p); 101 } 102 103 node* LinkList::reverse() { 104 if (getLength()==0 || getLength()==1) return head; 105 node *p1=NULL; 106 node *p2=head->next; 107 node *p3=p2->next; 108 while (p2!=NULL) { 109 p2->next=p1; 110 p1=p2; p2=p3; 111 if (p3!=NULL) p3=p3->next; 112 } 113 head->next=p1; 114 return head; 115 } 116 117 void LinkList::print() { 118 node *p=head; 119 while (p->next!=NULL) { 120 p=p->next; 121 cout<<p->val<<"->"; 122 } 123 cout<<"NULL"<<endl; 124 } 125 126 int main() 127 { 128 LinkList link; 129 130 link.insertToEnd(1); link.insertToEnd(2); link.insertToEnd(3); link.insertToEnd(4); link.insertToEnd(5); 131 link.print(); 132 133 link.insertByIndex(link.findElem(3),9); 134 link.insertByIndex(link.findElem(1),7); 135 link.print(); 136 137 link.deleteByIndex(link.findElem(1)); 138 link.deleteByIndex(link.findElem(4)); 139 link.print(); 140 141 link.reverse(); 142 link.print(); 143 return 0; 144 }