链表跟线性表类似,但由于位置不是连续存放的,因此插入删除很方便,切时间复杂度不高。
链表的创建
首先我们得定义一个节点。
struct Node
{
int data;
Node *next;
Node(int _data = 0, Node *_next = NULL) :data(_data), next(_next) {}
};
节点包括数据与和指针域,指针域指向它要连接的下一个节点,这里只是一个单一的节点,因此构造构造函数中设置了数据为0,指针为NULL。
后来把节点连接成一个链表
Node *createList(int n, int *data)
{
Node *head = new Node;
Node *tail, *s;
tail = head;
for (int i = 0; i < n; i++)
{
s = new Node(data[i], NULL);
tail->next = s;
tail = s;
}
return head;
}
n指的是我们想要建立的节点数,data指的是我们想要建立的节点的数据域。首先建立了一个头结点,这个头结点的数据域为0,指针为NULL,头结点的建立主要是为了我们以后进行删除和插入方便,可以不用进行分类情况,然后为了不让头节点移动,我们新建立另一个节点名为tail,就是尾结点,就是我们一建立节点,就把新建的节点视作尾节点,这通过tail->next=s,tail=s来实现。
插入节点
Node *findnode(Node *head, int i)
{
Node *p = head;
int count = 0;
while (p&&count < i)
{
count++;
p = p->next;
}
return p;
}
int insert(Node *head, int loc, int elem)
{
if (loc<1 || loc>getlength(head) + 1)
return 0;
Node *p = findnode(head, loc - 1);
Node *s = new Node(elem, p->next);
p->next = s;
return 1;
}
首先思路是先找到我们想要插入位置的前一个节点,然后找到后一个节点,然后建立一个插入的节点,然后把新的节点链接到前面的和后面的节点。前一个节点的查找是通过p=head,p=p->next来实习的,就是找到头节点,然后一个个来移动,直到找到前一个节点。
在Insert函数中p就是前一个前一个节点,p->next就是后一个节点,s是我们新建的节点,新建的节点的数据域为我们插入的elem,然后这个节点的指针域为p->next就是指向后一个节点,然后把新节点链接给前一个节点,p->next=s来实现前面的节点的链接。
删除节点
int deletenode(Node *head, int i)
{
if (i<1 || i>getlength(head) + 1)
return 0;
Node *p = findnode(head,i - 1);
p->next = p->next->next;
return 1;
}
首先p就是我们删除的节点的前一个节点,然后把前一个节点的指针指向后后一个节点,就这样实现了释放一个节点。