链表是一种基本的数据结构,它由链表结点串联而成,在内存中的存放地址是不连续的。链表结点包含了一个值和指向下一个结点的指针,本篇文章介绍链表的基本操作,包括链表的建立,遍历,查询和删除。
#include <iostream>
/*
arr为数组,length为数组长度
*/
LinkNode *createLink(int arr[], int length)
{
if (arr == NULL) {
return NULL;
}
int i = 0;
//链表头指针
LinkNode *head = NULL;
//临时结点,用于记录当前位置
LinkNode *preNode = NULL;
for (i = 0; i < length; i++) {
LinkNode *node = new LinkNode();
node->val = arr[i];
if (preNode == NULL) {
head = node;
preNode = node;
} else {
preNode->next = node;
}
preNode = node;
}
//最后一个node的next指向NULL
preNode->next = NULL;
return head;
}
//遍历链表
void traverse(LinkNode *node) {
if (node == NULL) {
return;
}
LinkNode *tmpNode = node;
while (tmpNode) {
std::cout<<tmpNode->val<<std::endl;
tmpNode = tmpNode->next;
}
}
//查询链表中第一个值,number为待查找的数字,找到返回0,否则返回-1
int findNumber(LinkNode *head, int number) {
if (head == NULL) {
return -1;
}
LinkNode *node = head;
while (node) {
if (node->val == number) {
return 0;
} else {
node = node->next;
}
}
return -1;
}
//删除链表中一个结点,number为待删除数字
//返回链表的头结点
LinkNode * deleteNode(LinkNode *head, int number) {
if (head == NULL) {
return NULL;
}
//result为删除之后,链表的头结点
LinkNode *result = head;
//记录待删除结点的前面一个结点
LinkNode *preNode = head;
//如果要删除的是头结点,需要单独处理
if (head->val == number) {
result = head->next;
head->next = NULL;
return result;
} else {
preNode = head;
while (preNode && preNode->next && preNode->next->val != number) {
preNode = preNode->next;
}
//preNode->next为空,代表没找到待删除结点
if (preNode->next) {
LinkNode *numNode = preNode->next;
preNode->next = numNode->next;
}
}
return result;
}
//反向打印链表,递归实现
void traverseLinkReverse(LinkNode *head) {
if (head == NULL) {
return;
}
LinkNode *tmpNode = head;
if (tmpNode->next) {
traverseLinkReverse(tmpNode->next);
}
std::cout<<tmpNode->val<<std::endl;
}
int main(int argc, const char * argv[]) {
//LinkedList
int arr[5] = {1, 2, 3, 4, 5};
LinkNode *head = createLink(arr, 5);
traverse(head);
std::cout<<findNumber(head, 9)<<std::endl;
head = deleteNode(head, 6);
traverseLinkReverse(head);
return 0;
}