zoukankan      html  css  js  c++  java
  • 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 } 
  • 相关阅读:
    sun.misc.Unsafe
    一个普通Java程序包含哪些线程??
    类加载-类加载器
    类加载-类的生命周期
    类加载-初始化的触发
    Java语法糖
    Java线程池
    Java线程池之ThreadPoolExecutor
    【结构型】- 适配器模式
    数据结构与算法之排序(3)插入排序 ——in dart
  • 原文地址:https://www.cnblogs.com/clno1/p/12781476.html
Copyright © 2011-2022 走看看