typedef struct Node {
int data;
struct Node* next;
} Node;
//求链表中间结点的值
Node* middleElement(Node* list) {
Node* slow = list, * fast = list;
while (fast && fast->next) {
slow = slow->next;
fast = fast->next->next;
}
return slow;
}
//判断单链表是否有环
bool hasCircle(Node* list) {
if (!list || !list->next) {
return false;
}
Node* slow = list;
Node* fast = list->next;
while (fast && fast->next) {
if (slow == fast) {
return true;
}
slow = slow->next;
fast = fast->next->next;
}
return false;
}
//反转单链表
Node* reverse(Node* list) {
//递归
if (!list || !list->next) return list;
Node* tail = reverse(list->next);
list->next->next = list;
list->next = NULL;
return tail;
//循环
//if (!list || !list->next) return list;
//Node* cur = NULL, * tmp = list, * tail = list;
//while (tmp) {
// tail = tail->next;
// tmp->next = cur;
// cur = tmp;
// tmp = tail;
//}
//return cur;
}
//合并两条有序的单向链表,使得合并后的链表也是有序的
//(要求: 不能额外申请堆内存空间)
Node* mergeTwoLists(Node* list1, Node* list2) {
//递归
if (!list1) return list2;
if (!list2) return list1;
if (list1->data < list2->data) {
list1->next = mergeTwoLists(list1->next, list2);
return list1;
} else {
list2->next = mergeTwoLists(list1, list2->next);
return list2;
}
//循环
//Node mNode = { -1, NULL };
//Node* mList = &mNode;
//while (list1 && list2) {
// if (list1->data < list2->data) {
// mList->next = list1;
// list1 = list1->next;
// } else {
// mList->next = list2;
// list2 = list2->next;
// }
// mList = mList->next;
//}
//mList->next = (!list1) ? list2 : list1;
//return mNode.next;
}
【C语言】20_链表的常见面试题,求中间结点 & 判断是否有环 & 反转 & 合并两条有序链表
最新推荐文章于 2024-07-08 22:12:26 发布