一、将两个有序单链表合成一个有序单链表
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);
}