链表程序

一、将两个有序单链表合成一个有序单链表

LinkNode* LinkListMerge(LinkNode* head1,LinkNode* head2){
 if(head1 == NULL){
   return head2;
 }
 if(head2 == NULL){
   return head1;
 }
 LinkNode* cur1 = head1;
 LinkNode* cur2 = head2;
 LinkNode* new_head = NULL;
 LinkNode* new_tail = NULL;
while(cur1 != NULL && cur2 != NULL ){
  if(cur1->data < cur2->data){
    if(new_tail == NULL){
      new_tail = new_head = cur1;
    }
    else{
      new_tail->next = cur1;
      new_tail = new_tail->next;
    }
  cur1 = cur1->next;
  }
 else{
   if(new_tail == NULL){
     new_tail = new_head = cur2;
   }
   else{
     new_tail->next = cur2;
     new_tail = new_tail->next;
   }
  cur2 = cur2->next;
 }
 if(cur1 != NULL){
   new_tail->next = cur1;

}

else{
   new_tail->next = cur2;
 }
return new_head;
 }

}

二、判断单链表是否带环

int LinkListHasCycle(LinkNode* head){
  if(head == NULL){
    return 0;
  }
  LinkNode* fast = head;
  LinkNode* slow = head;
  while(fast != NULL && fast->next != NULL){
     fast = fast->next->next;
     slow = slow->next;
    if(fast == slow ){
      return 1;
    }
  }
 return 0;

}

三、求链表环长

size_t LinkListCyclelen(LinkNode* head)
{
if(head == NULL)
{
return 0;
}
LinkNode* fast = head;
LinkNode* slow = head;
while(fast != NULL && slow != NULL)
{
fast = fast->next->next;
slow = slow->next;
if(fast == slow)
{
size_t count = 0;
LinkNode* flag = slow->next;
while(flag != slow)
{
flag = flag->next;
++count;
}
}
return count;
}

}

四、查找一个单链表的中间结点

LinkNode* LinkListFindMidNode(LinkNode* head)
{
if(head == NULL)
{
return NULL;
}
LinkNode* fast = head;
LinkNode* slow = head;


while(fast != NULL && fast->next != NULL)
{
slow = slow->next;
fast = fast->next->next;
}
return slow;

}

五、查找单链表的倒数第K个结点

LinkNode* LinkListFindLastKNode(LinkNode* head,int k)
{
if(head == NULL)
{
return NULL;
}
LinkNode* fast = head;
LinkNode* slow = head;


int i = 0;
for(;i<k;i++)
{
fast = fast->next;
}
if(i != k)
{
return NULL;
}
while(fast != NULL)
{
slow = slow->next;
fast = fast->next;
}
return slow;

}

六、删除链表的倒数第K个结点

void LinkListEraseLastKNode(LinkNode** phead,int k)
{
if(*phead == NULL)
{
return;
}
if(phead == NULL)
{
return;
}
int len = LinkListSize(head);
if(k >len)
{
return;
}
if(k == len)
{
LinkNode* to_delete = *phead;
*phead = (*phead)->next;
DestroyNode(to_delete);
return;
}
LinkNode* pre = *phead;
int i = 0;
for(;i<len-(1+k);++i)
{
pre = pre->next;
}
LinkNode* to_delete = pre->next;
pre->next = to_delete->next;
DestroyNode(to_delete);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值