题目1:链表的中间结点
题目来源:leetcode链表的中间结点
第一种思路分析:考虑指针移动到相应的位置来做
参考代码:位置(/chapter2/c++/middle-link-list-node/lc1.cc)
- #include
- extern "C"{
- #include
-
- }
-
- 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;
-
- }
运行结果:

文章持续更新中。。。。。。