基础概念

1.什么是链表

  • 链表是一种物理存储单元非连续非顺序的存储结构。
  • 链表由一系列结点组成,每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。当链表的每个结点只包含一个指针域时,此链表称为单链表

2.链表的基本操作

  • 新建头结点:
    clipboard.png
    将节点的next置为NULL即可。
  • 插入新的节点(以在head后插入为例)
    clipboard.png
    新建一个新的节点p,使p的next的指向head->next所指向的地址,然后将head->next从新指向p
  • 删除指定节点:
    clipboard.png
    先遍历到指定节点的前一个节点,然后通过将前一个节点的next指针指向指定节点的下一个节点,达到悬空指定节点的效果,然后删除指定节点
  • 修改指定节点:
    clipboard.png
    遍历到指定节点的位置,将其data修改为要修改的值
  • 链表反转
    clipboard.png
    定义三个临时节点指向头结点之后的第1个节点p,第2个节点q和第3个节点m。将p->next置为空,然后将q->next = p,然后将p向后移动一个节点,即p = q,最后将q向后移动一个节点,即q = m,最后把m向后移动一个节点,即m = m->next;依此类推直到m等于NULL,然后将q->next = p,最后将head->next指向q

3.头指针、头结点、头元素

clipboard.png
clipboard.png

  • 在单链表的第一个结点(有效元素)之前附设一个结点,称之为头结点;
  • 指向头结点的指针,称之为头指针;
  • 对于头结点,数据域可以不存储任何信息,也可存储如链表长度等附加信息
  • 首元结点就是第一个元素的结点,它是头结点后边的第一个结点
  • 对单链表的存取必须从头指针开始进行,由于单链表的最后一个数据元素没有直接后继,则指针为NULL。
头指针与头结点不同,头结点即第一个结点,头指针是指向第一个结点的指针。链表中可以没有头结点,但不能没有头指针。

代码实现

1.链表的创建、插入、删除、修改、反转

#include <iostream>
using namespace std;

struct Node{
    int data;
    Node *next;
    //Node(int d):data(d),next(NULL){}
    Node(int d){
        data = d;
        next = NULL;
    }
};

class List{
public:
    Node *head;

    void create_List(){
        head = new Node(0);
    }

    void insert(int d){
        Node *p = new Node(d);
        p->next = head->next;
        head->next = p;
    }

    void print(){
        for(Node *p=head->next; p; p=p->next){
            cout<<p->data<<"-->";
        }
    }

    Node* find(int d){
        Node *p;
        for(p=head;p;p=p->next){
            if(p->next->data == d){break;}//这里需要注意返回的是目标节点的前一个节点,这样做是为了便于删除节点
        }
        return p;
    }

    void insert_pos(int d, int res){

        Node *p = find(d);
        p = p->next;//注意,之前的p不是目标节点,p->next才是
        Node *q = new Node(res);
        q->next = p->next;
        p->next = q;
    }

    void delete_pos(int d){
        Node* p = find(d);//注意
        Node* q = p->next;
        p->next = q->next;
        delete q;
    }

    void update(int d, int res){
        Node* p = find(d);//注意
        p = p->next;
        p->data = res;
    }

//这个很重要!!
    void reverse(){
        Node* p = head->next;
        Node* q = p->next;
        Node* m = q->next;
        p->next = NULL;

        while(m){
            q->next = p;
            p = q;
            q = m;
            m = m->next;
        }

        q->next = p;
        head->next = q;
    }
};

int main() {
    List list;
    list.create_List();
    list.insert(100);
    list.insert(120);
    list.insert(210);
    list.insert(300);
    list.insert(400);
    list.insert(500);
    list.insert(600);

    cout<<".............create list.................."<<endl;
    list.print();

    cout<<endl<<"............insert node.................."<<endl;
    list.insert_pos(210,800);
    list.print();

    cout<<endl<<".............delete node.................."<<endl;
    list.delete_pos(800);
    list.print();

    cout<<endl<<".............update node..................."<<endl;
    list.update(600,700);
    list.print();

    cout<<endl<<".............reverse list.................."<<endl;
    list.reverse();
    list.print();

    return 0;
}

clipboard.png

参考1:https://www.cnblogs.com/scand...
参考2:http://www.nowamagic.net/libr...

wydong
40 声望5 粉丝

wyd