scanf("%d",&num);
}
// 头插法 逆序插法
// while(num!=-1)
// {
// p=(struct ListNode*)malloc(sizeof(struct ListNode));
// p->val=num;
// if(head==NULL)
// {
// head=p;
// }
// else
// {
// p->next=head;
// head=p;
// }
// }
tail->next=NULL//用p->next也行 这是尾插法
return head;//返回链表头指针
}
②链表节点的插入
struct ListNode *insertList(ListNode *head,int index,int num)//index 表示在链表中插入的位置(从1开始)原位置的元素接在其后 num表示要插入的数值
{
struct ListNode *p=NULL,q;//在此q为虚拟节点 主要方便对链表进行操作
int cnt=1;//计数器从1开始计数
if(head==NULL&&head->next==NULL)//链表为空 返回一个空指针
return NULL;
if(index==1)//若插在头结点(在此特指链表的第一个节点)的位置
{
p=(struct ListNode*)malloc(sizeof(struct ListNode));//给p开辟实际空间 用来储存操作存入的值
p->val=num;
p->next=head;
head=p;
}
else
{
q=head;
while(q->next!=NULL&&cnt<=index)//对于链表我们通常对当前节点的下一个节点进行操作
{
if(cnt+1<index)//为什么要加一呢?因为表示下一个位置
{
q=q->next;
}
else
{
p=(struct ListNode *)malloc(sizeof(struct ListNode));
p->val=num;
p->next=q->next;
q->next=q;
}
}
}
if(cnt<index)//如果cnt还是 小于 index 则表明插在链表末尾
{
p=(struct ListNode*)malloc(sizeof(struct ListNode));
p->val=num;
p->next=NULL;
q->next=p;
}
return head;
}
③链表节点的删除
struct ListNode *deleteList(struct ListNode *head,int num)//执行删除节点val值为num的操作
{
struct ListNode *p=NULL,*q=NULL;//p,q均为辅助指针 不给他们开辟实际空间
if(head->val==num)//若删除节点为头结点
{
p=head;
head=head->next;
free(p);
}
else//若删除节点为除头结点外的其他节点
{
p=head;
while(p->next!=NULL)
{
if(p->next->val==num)
{
q=p->next;
p->next=p->next->next;
free(q);
}
else
{
推荐阅读
- 考古学家真的会挖墓吗-,考古学家为什么可以挖掘古墓-
- 2020年流行的小吃最火的是什么,今年啥小吃最火-
- 道德沦丧是当前经济滑坡的根本原因,市场经济必然导致道德滑坡吗-
- 西部歌王王洛宾与三毛的故事,三毛和歌王王洛宾-
- 贾宝玉和紫鹃的关系,红楼梦中谁和雪雁是黛玉的丫鬟-
- 典韦是哪个时期的人物,典韦在历史上是什么人物--
- 和张曼玉演过甜蜜蜜的是谁,张曼玉甜蜜蜜剧情-
- 朱元璋的五虎上将是谁,项羽手下的五虎将-
- 普洱茶班章茶特点,山头普洱茶味道的回忆
- 昆仑神宫|《昆仑神宫》高开低走,一星刷满屏,观众的差评理由出奇一致