1.带头结点的单链表L中所有元素为整数,设计一个算法将所有小于零的节点移到所有大于等于零的节点的前面。
typedef signed int ElemType;
typedef struct LNode
{ // 定义单链表结点
ElemType data;
struct LNode *next; // 指向后继的指针域
}LNode, *LinkList;
void fun(LinkList &L)
{
LinkList posHead=(LinkList)malloc(sizeof(LNode));//存放大于等于0的单链表头节点
posHead->next=NULL;
LinkList p=L;//迭代指针
LinkList q;//临时指针
while((p->next)!=NULL)
{
while(p->next->data>=0)
{
q=p->next;//用q来临时存放p的下一个节点
p->next=q->next;//将data>=0的节点(q)从链表中移除
q->next=posHead->next;//头插法
posHead->next=q;//构建一个大于等于0的单链表
}
p=p->next;
}
p->next=posHead->next;//将大于等于零的节点链表添加到原链表后
}
2.有一个由整数元素构成的单链表LA,设计一个算法,将其拆分成两个单链表LA和LB,使得LA单链表中含有所有的偶数节点,LB单链表中含有所有的奇数节点,且保持原来的相对次序。
typedef signed int ElemType;
typedef struct LNode
{ // 定义单链表结点
ElemType data;
struct LNode *next; // 指向后继的指针域
}LNode, *LinkList;
void split(LinkList &L,LinkList &LA,LinkList &LB)
{
LinkList p=L->next,q;
LinkList tail_A,tail_B;//尾插法的尾指针
//将两个指针初始化
LA=(LinkList)malloc(sizeof(LNode));
LA->next=NULL;
tail_A=LA;
LB=(LinkList)malloc(sizeof(LNode));
LB->next=NULL;
tail_B=LB;
while(p!=NULL)
{
q=p->next;//临时存放p的下一个节点
if((p->data)%2==0)//如果为偶数,将节点放到LA里
{
p->next=tail_A->next;
tail_A->next=p;
tail_A=p;//更新尾指针
}
else //如果为奇数,将节点放到LB里
{
p->next=tail_B->next;
tail_B->next=p;
tail_B=p;//更新尾指针
}
p=q;//重新迭代
}
}
该博客探讨了两个关于单链表的操作:一是如何将带头结点的单链表中所有小于零的元素移到大于等于零的元素之前;二是如何拆分包含整数元素的单链表,形成分别包含偶数和奇数节点的两个链表,同时保持原有次序。
7811

被折叠的 条评论
为什么被折叠?



