题目1:链表的中间结点
题目来源:leetcode链表的中间结点
第一种思路分析:考虑指针移动到相应的位置来做
参考代码:位置(/chapter2/c++/middle-link-list-node/lc1.cc)
#include <stdio.h>
extern "C"{
#include <linklist.h>
}
link_list_node *middle_node(link_list_node *p_head)
{
//直接用头结点来保存中间结点的地址
if (p_head == NULL)
{
return NULL;
}
int pos = (p_head->value / 2);
//开始移动相应指针,移动到我们想要结点的前一个结点
//然后next就是下一个结点
for (int i = 0; i < pos; i++)
{
p_head = p_head->next;
}
return p_head->next;
}
int main()
{
link_list_node *p_head = create();
//插入12345这几个数据
insert_elem(p_head, 1, p_head->value);//全部在最后一个位置插入
insert_elem(p_head, 2, p_head->value);//全部在最后一个位置插入
insert_elem(p_head, 3, p_head->value);//全部在最后一个位置插入
insert_elem(p_head, 4, p_head->value);//全部在最后一个位置插入
insert_elem(p_head, 5, p_head->value);//全部在最后一个位置插入
insert_elem(p_head, 6, p_head->value);//全部在最后一个位置插入
//打印一下
print_list(p_head);
p_head = middle_node(p_head);
while (p_head != NULL)
{
printf("%d ", p_head->value);
p_head = p_head->next;
}
//我们要的是中间结点
return 0;
}
这里说一下我用到自己之前写的一个单链表的动态库,不会的同学可以参考我在Linux专栏动态库与静态库制作,后面就不在多说了
下面是Lc提交代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* middleNode(struct ListNode* p_head){
//直接用头结点来保存中间结点的地址
if (p_head == NULL)
{
return NULL;
}
//按照lc提交的意思就是
//p_head->val返回的不是长度
//所以需要我们自己来计算长度
int len = 0;
struct ListNode *p_node = p_head;
while (p_node != NULL)
{
p_node = p_node->next;
len++;
}
len = (len / 2);
//开始移动相应指针,移动到我们想要结点的前一个结点
//然后next就是下一个结点
for (int i = 0; i < len; i++)
{
p_head = p_head->next;
}
return p_head;
}
运行结果:
文章持续更新中。。。。。。