=
pre->next,然后把cur连接的一串链表连接到pre后面,即pre->next
=
cur
上面介绍了,在一个节点之后插入节点的情况。这是通常的情况。如果要向一个链表的头部插入节点,就只需要将新节点的下一个指针指向链表的头指针即可。
在这种情况下,有两点要注意:
1,链表是否为空链表
2,要插入的节点是不是空指针。
代码实现:
//向单链表中插入一个节点(插入在链开始处)
//输入参数:单链表的头指针和要插入的节点指针
//输出参数:无
//返回值:指向单链表的头指针
singlelist*
insert(singlelist
*head,singlelist
*node)
{
if(node
==
null)
{
return
head
}
else
if(head
==
null)
{
return
node
}
node->next
=
head
head
=
node
return
head
}
链表交换节点有两种方式:1.
交换结点内容
2.
交换结点位置
如定义以下结构体,分为数据部分和链表指针部分
struct _data {
int num
float score
}
struct stu
{
struct _data data
struct stu *next
}*head, *p1,*p2,*p3,*p4
head->p1->p2->p3->p4 交换结点内容,结点顺序不变,依然保持原样,则交换两个结点时,只交换数据部分,next指针不要动,如:交换p1和p3的内容(数据):
struct _data t=p1->datap1->data=p3->datap3->data=t //这样就可以了。交换结点位置,链表的顺序会发生变化,为保持链表的正常衔接,则要重新设置next的值,过程略有复杂,如:交换p1,p3的位置:最终变成:head->p3->p2->p1->p4
首先,要找到p1的原前趋结点head,和p3的前趋结点p2
然后,开始重新分配链表的排列:
1、p1的原前趋结点(head)的新后继结点 要变成p3
2、p1的新后继结点要变成p3的原后继结点(p4)
3、p3的原前趋结点(p2)的新后继结点 要变成p1
4、p3的新后继结点要变成p1的原后继结点(p2)
struct stu *p1p, *p3p, *p
for( p=headp!=NULLp=p->next )
{
if ( p->next==p1 )
p1p=p//找到p1的前趋head
if ( p->next==p3 )
p3p=p//找到p3的前趋p2
}
p1p->next=p3//p1的原前趋结点 的 新后继结点 变成p3 head->p3
struct stu *tNext=p1->next //保存p1的原后继结点(p2)
p1->next=p3->next//p1的新后继结点要变成p3的原后继结点(p4) p1->p4
p3p->next=p1//p3的原前趋结点 的 新后继结点 变成p1 p2->p1
p3->next=tNext //p3的新后继结点 变成p1的原后继结点 p3->p2