# C++实现单链表（2） 一些函数的实现

{
{
return;
}
else
{
}
/*
{
}
*/
}
ListNode * SearchMidNode(ListNode * pHead)  //寻找中间结点
{
while (fast!=NULL && fast->_next != NULL)
{
fast = fast->_next;
slow = slow->_next;
fast = fast->_next;
}
return slow;  //如果是一个结点直接返回slow
}
void PrevInsert(ListNode* &pos, DataType x)   //无头链表的前插  先后插再交换数据
{
assert(pos);
tmp->_next = pos->_next;
pos->_next = tmp;
//利用没有用的x 节省空间
x = pos->_data;
pos->_data = tmp->_data;
tmp->_data = x;
/*
assert(pos);
tmp->_next = pos->_next;
pos->_next = tmp;
//利用没有用的x 节省空间
pos->_data=x;
*/
}
//链表冒泡排序
{
ListNode * post = NULL;  //设置监视哨
int flag = 0;
if (cur == NULL||cur->_next==NULL)
return;
while (1)
{
flag = 0;
while (cur->_next != post)
{
if (cur->_data > cur->_next->_data)
{
//交换
flag = 1;
DataType tmp = cur->_data;
cur->_data = cur->_next->_data;
cur->_next->_data = tmp;
}
cur = cur->_next;
}
post = cur;
break;

}
}
//归并排序
{
{
pList1Cur = pList1Cur->_next;
}
else
{
pList2Cur = pList2Cur->_next;
}
while (pList1Cur&&pList2Cur)
{
if (pList1Cur->_data < pList2Cur->_data)
{
tail->_next = pList1Cur;
pList1Cur = pList1Cur->_next;
}
else
{
tail->_next = pList2Cur;
pList2Cur = pList2Cur->_next;
}
tail = tail->_next;
}
if (pList1Cur!= NULL)
{
tail->_next = pList1Cur;
}
else
{
tail->_next = pList2Cur;
}
}

ListNode * FindTailNode(ListNode * pHead, int k)  //寻找倒数第k个结点
{
int count = k;
while (count--)
{
if (fast == NULL)
return NULL;
fast = fast->_next;
}
while (fast != NULL)
{
fast = fast->_next;
slow = slow->_next;
}
return slow;
}
//判断一个单链表带环    注意不要出现NULL==NULL这种情况
//快慢指针解决
int IsCycle(ListNode *pHead)   //带环返回1  不带环返回0  错误返回-1
{
return -1;
fast = fast->_next->_next;
slow = slow->_next;
while (fast != NULL&&fast->_next != NULL&&fast != slow)
{
fast = fast->_next->_next;
slow = slow->_next;
}
if (fast == slow)
return 1;
else
return 0;
}
//带环则环中的一个结点指针  不带环返回NULL   判断是否有环的另一个版本
{
return NULL;
fast = fast->_next->_next;
slow = slow->_next;
while (fast != NULL&&fast->_next != NULL&&fast != slow)
{
fast = fast->_next->_next;
slow = slow->_next;
}
if (fast == slow)
return fast;
else
return NULL;
}

int CycleLength(ListNode *pHead)  //返回环的长度 没有环返回0  有环返回 1 - n
{
return -1;
fast = fast->_next->_next;
slow = slow->_next;
while (fast != NULL&&fast->_next != NULL&&fast != slow)
{
fast = fast->_next->_next;
slow = slow->_next;
}
if (fast == slow)
{
ListNode *sign = fast;
int count = 0;
fast = fast->_next;
while (sign != fast)
{
count++;
fast = fast->_next;
}
return count+1;
}
return 0;
}

//另一个版本的求环长度的函数
{
if (node == NULL)
return 0;
else
{
int count = 0;
ListNode * tmp = node->_next;
while (tmp != node)
{
count++;
tmp = tmp->_next;
}
return count + 1;
}
}

ListNode * Entrance(ListNode *pHead)  //求环入口的结点 返回指向入口结点的指针
{
ListNode * entrance = NULL;   //返回值
//首先先找到环的一个指针 把它当作一个链表的头
//当然，不能用写好的判断一般链表是否相交的函数 因为链表没有尾
//大前提是已经有环了 若无环返回NULL
//这样做费时
while (cur1 != cur2&&cur1!=NULL)
{
while (cur1 != cur2&&len--)
{
cur2 = cur2->_next;
}
if (cur1 == cur2)
return cur1;
else
cur1 = cur1->_next;
}
if (cur1 == cur2)
return cur1;
return NULL;
}

//判断两个链表是否相交
{
if (cur1 == NULL)
return 0;
if (cur2 == NULL)
return 0;
while (cur1 != NULL&&cur2 != NULL&&prevCur1!=prevCur2)
{
prevCur1 = cur1;
prevCur2 = cur2;
cur1 = cur1->_next;
cur2 = cur2->_next;
}
if (prevCur1 == prevCur2)
return 1;
else
return 0;
}

• 本文已收录于以下专栏：

## 单链表的实现(C++版)

// 带头节点单链表的C++实现 #include "stdafx.h" #include #include using namespace std; class CNode ...
• piaopiaopiaopiaopiao
• 2014年05月12日 20:27
• 6632

## 用C++实现单链表的创建、逆置和输出

• lfeng_coding
• 2015年08月05日 17:58
• 3092

## 【c++版数据结构】之用带头节点的单链表实现一元多项式（C语言版）

• ZongYinHu
• 2015年08月26日 20:32
• 1838

## 单向链表之C++实现

• KangRoger
• 2014年07月01日 21:20
• 8199

## C++模板类实现单链表

• Nou_Camp
• 2017年04月08日 17:15
• 854

## 用c++实现 c++单链表的实现（采用模板类）

• S0Soul
• 2015年05月25日 15:40
• 3769

## 线性表之单链表的c++实现

• mfcbest
• 2016年09月25日 10:50
• 450

## 4-1 单链表逆转 (20分)

• wanmeiwushang
• 2016年06月16日 17:10
• 3771

## 单链表的模板类实现

• Avalon_Y
• 2016年03月13日 11:38
• 3831

## C++实现链表基本操作

• Kevin_zhai
• 2016年01月10日 21:56
• 37103

举报原因： 您举报文章：C++实现单链表（2） 一些函数的实现 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)