链表结点的定义:
struct ListNode
{
int m_nKey;
ListNode* m_pNext;
};
1、单链表的创建
注意要创建头结点
ListNode *create(int *data,int len)//data[]输入的数组,len是输入数组长度
{
ListNode *head,*p,*q;//定义三个结点,首、中、尾
//head=(ListNode*)malloc(sizeof(ListNode));
head=new ListNode;//创建头节点
int i;
for(i=0;i<len;i++)
{
//p=(ListNode*)malloc(sizeof(ListNode));
p= new ListNode;//每次插入一个,就新建一个结点
p->m_nKey=data[i];
if(i==0)
{
head->m_pNext=p;//头结点
}
else
{
q->m_pNext=p;
}
q=p;
}
q->m_pNext=NULL;//链表最后一个指针为NULL
return head;
}
2、链表打印
void print_ListNode(ListNode *head)
{
ListNode *p;
if(head->m_pNext==NULL)
{
cout<<"链表为空"<<endl;
return;
}
p=head->m_pNext;
while(p!=NULL)
{
cout<<p->m_nKey<<" ";
p=p->m_pNext;
}
cout<<endl;
}
3、链表结点的删除
要找到删除结点前一结点的位置。从表头开始遍历,发现结点p的m_pNext指向要删除的结点i,于是我们可以把结点p的m_pNext指向i的下一个结点。指针调整后,就可以安全地删除结点i并保证链表没有断开。
如下图所示:
要考虑:删除的结点是第一个结点;删除的结点不是第一个结点;
ListNode *delete_node(ListNode* pListHead, int k)//要删除k,需要找到k值前一个节点
{
if(pListHead==NULL)
return NULL;
ListNode *p1=NULL;
ListNode *p2=NULL;
p1=pListHead;
if(p1->m_pNext->m_nKey==k)//删除的结点是第一个节点
{
p2=p1->m_pNext;
pListHead->m_pNext=p2->m_pNext;
delete p2;
return pListHead;
}
else //删除的结点是第一个节点
{
while(p1->m_pNext!=NULL)
{
if(p1->m_pNext->m_nKey==k)
{
p2=p1->m_pNext;
p1->m_pNext=p2->m_pNext;
delete p2;
}
else
{
p1=p1->m_pNext;
}
}
}
return pListHead;
}
主函数如下:
#include<stdio.h>
#include<iostream>
#include<vector>
#include<map>
#include<algorithm>
using namespace std;
struct ListNode
{
int m_nKey;
ListNode* m_pNext;
};
ListNode *create(int *data,int len);
ListNode *FindKthToTail(ListNode* pListHead, int k);
void print_ListNode(ListNode *head) ;
int main()
{
int num,n;
while(cin>>num)
{
cout<<"输入"<<num<<"个整数:"<<endl;
int *data=new int[num];
for(int i=0;i<num;i++)
{
cin>>data[i];
}
ListNode *head,*p;
head=create(data,num);
cout<<"创建的链表为:"<<endl;
print_ListNode(head);
cout<<"输入删除的结点:"<<endl;
cin>>n;
p=delete_node(head,n);
cout<<"输入删除的结点后链表为:"<<endl;
print_ListNode(p);
}
return 0;
}