题目:设有一个带头结点的循环单链表, 其结点值均为正整数。设计一个算法, 反复找出单链表中结点值最小的结点并输出,然后将该结点从中删除,直到单链表空为止,再删除表头结点。
思路:每次找出最小节点,删除并继续操作,直到整个链表为空,注意判断条件的变化
//19 循环单链表的最小值
void cycleListMinNode(LinkList &L){
//L的next不为空继续循环
while(L->next!=L){
//初始化四个节点,minnode保存最小值的节点,p保存当前节点,pre保存最小值的前驱,q保存前驱节点
LinkList pre=L,p=L->next,minpre=pre,minnode=p;
//循环遍历
while(p!=L){
//如果x比当前节点的值大,更新minnode
if(p->data < minnode->data){
//最小节点更新
minnode = p;
//最小前驱更新
minpre = pre;
}
//前驱更新
pre = p;
//继续遍历
p=p->next;
}
//删除操作
minpre->next = minnode->next;
//打印最小值节点
printf("%d,",minnode->data);
//释放最小值节点
free(minnode);
}
//释放链头
free(L);
}
题目: 单链表有环,是指单链表的最后一个结点的指针指向了链表中的某个结点( 通常单链表的最后一个结点的指针域是空的). 试编写算法判断单链表是否存在环。
思路:快慢指针,新建两个指针p,q,q比p始终快一个指针,若pq相遇则代表有环存在
//21环问题
bool islisthaveloop(LinkList &L){
//初始化节点
LinkList slow = L->next,fast = slow;
//链表遍历
while(fast){
//如果快慢指针相遇,则返回真
if(slow==fast){
return true;