链表基本操作

链表是一种基本的数据结构,它由链表结点串联而成,在内存中的存放地址是不连续的。链表结点包含了一个值和指向下一个结点的指针,本篇文章介绍链表的基本操作,包括链表的建立,遍历,查询和删除。

#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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值