/**
*链表部分1
*/
typedef struct LinkNode
{
int data;
struct LinkNode* next;
};
/// 1. 链表翻转
/// 思路双指针 分析时间复杂度和空间复杂度
/// 注意链表为空时
void ReverseList(LinkNode* head)
{
if (NULL == head) //只考虑为空时,一个节点不需要考虑,下面包含
return;
LinkNode* pre = NULL;
LinkNode* p = head->next;
while (p != NULL)
{
LinkNode* q = p->next; //双指针联合移动
p->next = pre;
pre = p;
p = q;
}
head->next = pre;
}
/// 2.查找链表倒数第k个结点(k>0)
/// 思路:指针追赶法,快指针先走k步然后快慢指针同步走
/// 注意判断链表是否为空 以及长度是否达到k
LinkNode* SearchNode(LinkNode* head,unsigned int k)
{
if (NULL == head)
return NULL;
LinkNode* fast = head->next;
LinkNode* slow = head->next;
while (k-- && fast != NULL) //fast 先走
{
fast = fast->next;
}
if (k != 0) //判断当前链表长度是否达到k
return NULL;
while (fast != NULL) //双指针同步走
{
fast = fast->next;
slow = slow->next;
}
return slow;
}
/// 3. 查找链表中间结点
/// 思路:指针追赶 快指针走两步 慢指针走一步
/// 注意:链表为空时 以及结束循环条件
LinkNode* SearchMidNode(LinkNode* head)
{
if (NULL == head)
return NULL;
LinkNode* fast = head->next;
LinkNode* slow = head->next;
while (fast != NULL && fast->next != NULL)
{
fast = fast->next->next;
slow = slow->next;
}
return slow;
}
/// 4.从尾到头打印链表
/// 思路:(1) 递归方法(2)逆置后再打印(3)使用栈
//递归
void PrintLinkNode(LinkNode* head)
{
if (NULL == head) // 递归终止条件
return;
else
{
PrintLinkNode(head->next); //递归调用
printf("%d", head->data); //打印
}
}
//使用栈
void PrintLinkNode2(LinkNode* head)
{
if (NULL == head)
return;
else
{
std::stack<LinkNode* >link_node_stack;
LinkNode* p = head->next;
//入栈
while (p != NULL)
{
link_node_stack.push(p);
p = p->next;
}
//出栈打印
while (!link_node_stack.empty())
{
p = link_node_stack.top();
printf("%d", p->data);
link_node_stack.pop();
}
}
}
/// 5.合并两有序链表为一个有序链表(顺序为递增)
/// 思路:每个链表定义一个工作指针 比较 移动
/// 注意:两链表是否为空 都不为空时要考虑是否有交点 最后要考虑长度不一的收尾工作
LinkNode* MergeLink(LinkNode* head1, LinkNode* head2)
{
if (NULL == head1)
return head2;
if (NULL == head2)
return head1;
LinkNode* p1 = head1->next;
LinkNode* p2 = head2->next;
LinkNode* merge = head1;
while (p1!=NULL && p2!=NULL)
{
//考虑相交
if (p1 == p2)
{
merge=p1;
break;
}
if (p1->data < p2->data)
{
merge->next = p1;
merge = p1;
p1 = p1->next;
}
else
{
merge->next = p2;
merge = p2;
p2 = p2->next;
}
}
//长度不一样处理 收尾
if (p1 == NULL)
merge->next = p2;
if (p2 == NULL)
merge->next = p1;
return merge;
}
单链表部分1
最新推荐文章于 2022-12-06 11:34:06 发布