题目:写一个算法,判断单链表的数据是否中心对称
思想:
单链表由于其存储结构的特点,不是很方便直接判断是否是中心对称的,所以我们可以将单链表中的元素先存放到一个数组中,采用双指针的方法一头一尾进行扫描,以空间换时间。
代码展示:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
/*
* 题目:写一个算法,判断单链表的数据是否中心对称
* */
typedef struct LinkNode
{
int data;
struct LinkNode *next;
}LinkNode,*LinkList;
void InitLinkList(LinkList &L)
{
L = (LinkList)malloc(sizeof(LinkNode));
L->next = NULL;
}
void InsertLinkList(LinkList &L,int x)
{
LinkList p;
p = (LinkList)malloc(sizeof(LinkNode));
p->data = x;
p->next = L->next;
L->next = p;
}
void Print(LinkList L)
{
printf("单链表中的元素为:");
while(L->next!=NULL)
{
printf("%d ",L->next->data);
L = L->next;
}
printf("\n");
}
int GetLength(LinkList L)
{
int length = 0;
while(L->next!=NULL)
{
length++;
L = L->next;
}
return length;
}
int Judge(int *arr,int length)
{
int p = 0;
int q = length-1;
while(q>p)
{
if(arr[p]!=arr[q])
{
return 0;
}
p++;
q--;
}
return 1;
}
void Dispose()
{
LinkList L;
InitLinkList(L);
int n;
printf("请输入要输入第一个表中的元素个数:");
scanf("%d",&n);
int data;
printf("请输入要输入第一个表中的元素:");
for(int i=0;i<n; i++)
{
scanf("%d",&data);
InsertLinkList(L,data);
}
Print(L);
int length = GetLength(L);
int arr[length];
for(int j=0; j<length; j++)
{
arr[j] = L->next->data;
L = L->next;
}
if(Judge(arr,length))
{
printf("是中心对称的单链表!");
}
else
{
printf("不是中心对称的单链表!");
}
}
int main() {
Dispose();
return 0;
}