关于链表的所有基本操作(创建,打印,增加删除节点,反转)

贴出代码,其中主要部分已经注释。

#include <iostream>
#include <assert.h>

using namespace std;



struct LinkedNode{
    int val;
    LinkedNode* next;
    LinkedNode(int x):val(x),next(NULL){}
};
//******创建链表***********//
LinkedNode* creatLinkedList(int arr[],int n)
{
    LinkedNode* head = new LinkedNode(arr[0]);
    LinkedNode* cur = head;
    for(int i = 1; i < n;i++)
    {
        cur->next = new LinkedNode(arr[i]);
        cur = cur->next;
    }
    return head;
}
//******查询链表节点数***********//
int getCntNode(LinkedNode* head)
{
    if(head == NULL)
        return 0;
    LinkedNode* cur = head;
    int cnt = 0;
    while(cur != NULL)
    {
        cur = cur->next;
        cnt++;
    }
    return cnt;
}
//******打印链表***********//
void printLinkedList(LinkedNode* head)
{
    LinkedNode* cur = head;
    while(cur != NULL){
        cout<<cur->val<<"->";
        cur = cur->next;
    }
    cout<<"NULL"<<endl;
}
//******删除节点***********//
LinkedNode* deleteNode(LinkedNode* head,int value)   //value为要删除的值
{
    LinkedNode* xHead = new LinkedNode(0);
    xHead->next = head;
    LinkedNode* cur = xHead;
    while(cur->next!=NULL)
    {
        if(cur->next->val == value)
        {
            LinkedNode* deleteN = cur->next;
            cur->next = deleteN->next;
            delete deleteN;
        }
        else
            cur = cur->next;
    }
       LinkedNode* head1 = xHead->next;
       delete xHead;
       return head1;
}
//******增加节点***********//
//loc为增加节点的位置(在后面加), value为增加节点的值
LinkedNode* addNote(LinkedNode* head,int loc,int value)                                                                 
{
     if(loc<0)
      cout<<"你是猪么";
      assert(loc <= getCntNode(head)+1);
    if(loc == 0){
        LinkedNode* cur = new LinkedNode(value);
        cur->next = head;
        return cur;
    }
    LinkedNode* cur = head;
    while(--loc)
    {
      if(cur->next == NULL)
      {
          LinkedNode* cur1 = new LinkedNode(value);
          cur->next = cur1;
          cur1->next =NULL;
          return head;
      }
       cur = cur->next;
    }
    LinkedNode* curNext = cur->next;
    LinkedNode* addN = new LinkedNode(value);
    cur->next = addN;
    addN->next = curNext;
    return head;
}
//******反转链表***********//
LinkedNode* reverseNote(LinkedNode* head)
{
    LinkedNode* pre = NULL;
    LinkedNode* cur = head;
    while(cur!=NULL)
    {
        LinkedNode* nextNode = cur->next;
        cur->next = pre;
        pre = cur;
        cur = nextNode;
    }
    return pre;
}

int main()
{
    int a[] = {1,1,1,1,1,2,3,4,5,6,7};
    int n = sizeof(a)/sizeof(int);
    LinkedNode* head = creatLinkedList(a,n);
    printLinkedList(head);
    cout<<"该链表有"<<getCntNode(head)<<"个节点"<<endl;
    LinkedNode* head1 = deleteNode(head,2);
    printLinkedList(head1);
    cout<<"删除节点后,该链表有"<<getCntNode(head1)<<"个节点"<<endl;
    LinkedNode* head2 = addNote(head1,6,666);
    printLinkedList(head2);
    cout<<"增加节点后,该链表有"<<getCntNode(head2)<<"个节点"<<endl;
    LinkedNode* head3 = reverseNote(head2);
    printLinkedList(head3);
    cout<<"反转节点后,该链表有"<<getCntNode(head3)<<"个节点"<<endl;
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值