输出该单链表的中间结点的值,如果链表长度为偶数,则输出中间靠右的结点
题目要求:
输入数据创建一个单链表,实现一种算法。输出该单链表的中间结点的值,如果链表长度为偶数,则输出「中间靠右」的结点。如果链表只有一个元素,则输出唯一的元素。
算法思路:
- 创建一个单链表
- 设置两个指针,一个快指针fast,一个慢指针slow;
- 当快指针所指向的数据以及它所指向的下一个数据为空时,慢指针指向中间元素。
#include <iostream>
#define LIST_INIT_SIZE 100
#define Elemtype int
#define NULL 0
typedef struct LNode
{
Elemtype data;
struct LNode* next;
}LNode, * LinkList;
//创建一个单链表
LNode* CreatLinklist(void) {
LinkList head = (LNode*)malloc(sizeof(LNode));//定义头结点
head->data = 0;//初始化头结点,因为head->data指的是int,所以需要赋值一个具体的int
head->next = NULL;//头结点指向NULL
LNode* p = head;
printf("请输入链表的长度:");
int n;
scanf_s("%d", &n);
printf("请输入链表:\n");
for (int i = 0; i < n; i++) {
LNode* cur = (LNode*)malloc(sizeof(LNode));//声明一个新结点
int val;
scanf_s("%d", &val);
cur->data = val; // 输入的val值要赋值给cur
cur->next = NULL;
p->next = cur;
p = p->next;
}
return head;//创建完链表之后需要返回单链表的头部
}
//求链表的长度
int ListLength(LinkList head, LinkList p) {
int len = 0;
p = head->next;
while (p) {
p = p->next;
len++;
}
return len;
}
//寻找链表中间的值
int Middle(LinkList head, int n)
{
LinkList fast = head->next;
LinkList slow = head->next; // head->data是0,从head->next开始才是真正的链表
while (fast != NULL && fast->next != NULL) {
fast = fast->next->next;
slow = slow->next;
}
return slow->data;
}
int main() {
LinkList L;
L = CreatLinklist();//创建新的单链表L
printf("中间元素是:");
int middle = Middle(L, ListLength(L, L));
printf("%d", middle);
return 0;
}
实验结果:
做题时遇到的问题:
1.在写创建单链表的函数时return 0,导致返回的值是空,后改为return head。
2.寻找中间值的函数原先是:
int Middle(LinkList head,int n)
{
LinkList fast = head->next; // 第一个结点是头结点,值我设为了-1当然设为什么都可以
LinkList slow = head->next; // 所以从head->next开始才是真正的链表
slow->next = NULL;
fast->next = NULL;
//当n是偶数时
if (n % 2 == 0) {
slow = head;
fast = head;
for (; fast->next != NULL; fast = fast->next)
fast = fast->next;
slow = slow->next;
}