单链表习题(对应章节chapter2)

题目1:链表的中间结点

题目来源:leetcode链表的中间结点

第一种思路分析:考虑指针移动到相应的位置来做

单链表习题(对应章节chapter2)_第1张图片 参考代码:位置(/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专栏动态库与静态库制作,后面就不在多说了

单链表习题(对应章节chapter2)_第2张图片

下面是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;

}

 运行结果:

单链表习题(对应章节chapter2)_第3张图片

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

你可能感兴趣的:(算法刷题,算法)