单链表的基本操作(3):求并与反转

摘要:(1)求并操作,首先还是要考虑到特殊情况,即某个链表已经走到终点或者某个链表本身就是空的。这样只要找到非空链表的未处理部分,然后将它接在新链表后面就可以了。其次,考虑一般情况,当两个链表都不是空的时候,就比较它们的大小,相同就放入一个,不同就两个都都放入新的链表。同时注意大小放入的先后顺序,这样可以保持有序放入(如果P,L本身有序的话,当然在没有要求时也可以不排序)
(2)反转一个链表:从表头的下一个节点开始,定义变量Current、
,Previous,Next。其中Current代表现在要处理的节点。将Current的next指针指向Previous(current的前一个节点),然后依次将current赋值previous,Next(current的下一个)赋值Current,Next->next赋值Next,继续该操作,直到Next为空。最后将L(表头)指向最后的current,完成反转.

List SUM(List L, List P)
{
int big,small;
List Non_NULL;
List Temp;
List Mix_List = (List)malloc(sizeof(Node));
Mix_List->Next = NULL;
Temp = Mix_List;
while(L->Next!=NULL||P->Next!=NULL)
{
if(L->Next == NULL||P->Next ==NULL)
{
 Non_NULL = L->Next!=NULL?L:P;
  //处理为NULL
while(Non_NULL->Next!=NULL){
      Temp->Next = (List)malloc(sizeof(Node));
      Temp = Temp->Next;
      Temp->Element = Non_NULL->Next->Element;
  Non_NULL = Non_NULL->Next;
}
break;
}
if (L->Next->Element == P->Next->Element)
{
//处理相同元素
Temp->Next = (List)malloc(sizeof(Node));
Temp = Temp->Next;
Temp->Element = L->Next->Element;
L = L->Next;
P = P->Next;
continue;
}
else
{
//处理情况2 
//获得较大者
big = L->Next->Element;
small = P->Next->Element;
Temp->Next = (List)malloc(sizeof(Node));
    Temp = Temp->Next;
Temp->Element = big>small?big:small;
Temp->Next = (List)malloc(sizeof(Node));
    Temp = Temp->Next;
    Temp->Element = big<small?big:small;
L = L->Next;
    P = P->Next;
}
}
Temp->Next = NULL;
return Mix_List;
}

List Reverse(List L)
{
List Previous = NULL;
List Current = L->Next;
List Next = Current->Next;

while(Next != NULL)
{    
//单步反转链表
Current->Next = Previous;
Previous = Current;
Current = Next;
Next = Next->Next;
}
Current->Next = Previous;
L->Next = Current;//表头指向第一个元素
return L;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值