思路:原本是想定义一个变量用来记单链表A的序号的,但是后面代码写出来,发现,根本没有必要定义这个变量。用一个指针pa1直接指向带头节点的单链表A的后一个节点(也就是序号为1(奇数)的节点),它的后一个节点(如果不为NULL),那么肯定是一个序号为偶数的节点,对单链表A的操作是用指针pa2指向pa1的后一个节点,然后pa1的后一个节点直接指向pa2后一个节点,然后将pa2后一个节点为NULL,之后将pa2接在单链表B后面。【描述的不是很清楚哈!】
参考代码:
void function1(LinkList &A,LinkList &B){
LNode *pa1 = A->next,*pa2;
// 建立单链表B
B = (LNode *)malloc(sizeof(LNode));
B->next = NULL;
LNode *pb = B;
while(pa1){
if(pa1->next){
pa2 = pa1->next;
pa1->next = pa2->next;
pa2->next = NULL;
pb->next = pa2;
pb = pa2;
}
pa1 = pa1->next;
}
}
运行结果:


思路:直接用指针p指向L,进行循环遍历单链表L,循环的条件为p->next,如果L不为空,用指针q指向p的下一个节点,如果q所指的节点值为x,那么q前一个数据元素(即p)的next值为q的后一个节点(即q->next),并释放q所指向的节点所占的空间;如果q所指的节点值不为x,那么p=p->next(或者p=q)。按照上述步骤循环下去,直到p指向L的末尾,退出循环即可。
参考代码如下:
void function2(LinkList &L,ElemType x){
LNode *p = L;
while(p->next){
LNode *q = p->next;
if(q->data == x){
p->next = q->next;
free(q);
}else{
p = p->next;
}
}
}
运行结果:

【注】:运行结果是删除L中值为4的节点。
void function3(LinkList L){
LNode *curr = L->next,*next;
L->next = NULL;
while(curr){
next = curr->next;
curr->next = L->next;
// 使用头插法
L->next = curr;
curr = next;
}
}
运行结果:

【注】:上述代码只是将原单链表逆序,然后再输出,如果题目要求不改变原单链表,可以参考如下。
参考代码:
void function4(LinkList L){
if(L->next)
function4(L->next);
if(L)
printf("%d ",L->data);
}
思路:最小值节点可能在单链表L的末尾,因此,必须用一个节点来记住最小节点的前驱节点。
参考代码:
void function5(LinkList &L){
LNode *p = L,*pre;
int min_v = 999999; // 一个最大的数
while(p->next){
if(p->next->data<min_v){
min_v = p->next->data;
pre = p;
}
p = p->next;
}
pre->next = pre->next->next;
}
运行结果:



思路:因为递增有序,所以数值相同的元素如果存在肯定是挨在一起的,找到这些数值相同的节点起点节点和终止节点,然后进行处理即可。不过需要注意在单链表末尾时的情况(当然两个两个节点单独处理也行)。
void function6(LinkList &L){
LNode *p = L->next,*pre;
int temp = p->data;
pre = p;
while(p){
if(temp != p->data){
pre->next = p;
pre = p;
temp = p->data;
}
if(!p->next)
pre->next = NULL;
p = p->next;
}
}
运行结果:

思路:和将两个按元素递增次序排列的单链表合并成一个递增的单链表一样,但是需要注意使用头插法来链接单链表的节点。
参考代码:
void function7(LinkList &L1,LinkList &L2){
LNode *p1 = L1->next,*p2 = L2->next,*tail;
L1->next = NULL;
while(p1&&p2){
if(p1->data > p2->data){
tail = p2->next;
// 头插法
p2->next = L1->next;
L1->next = p2;
p2 = tail;
}else{
tail = p1->next;
// 头插法
p1->next = L1->next;
L1->next = p1;
p1 = tail;
}
}
// 两个单链表进行上述循环后,有可能还有一个单链表还没有到达末尾
if(p2){
p1 = p2;
}
while(p1){
tail = p1->next;
p1->next = L1->next;
L1->next = p1;
p1 = tail;
}
}
运行结果:
