贴出代码,其中主要部分已经注释。
#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;
}