C++实现单链表

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 } 
原文地址:https://www.cnblogs.com/clno1/p/12781476.html