给定一个单向链表(长度未知),请设计一个既节省时间又节省空间的算法来找出该链表中的倒数第m个元素。实现这个算法,并为可能出现的特例情况安排好处理措施。“倒数第m个元素”是这样规定的:当m=0时,链表的
2014-02-24 18:06
1446 查看
给定一个单向链表(长度未知),请设计一个既节省时间又节省空间的算法来找出该链表中的倒数第m个元素。实现这个算法,并为可能出现的特例情况安排好处理措施。“倒数第m个元素”是这样规定的:当m=0时,链表的最后一个元素将被返回:
#include <stdlib.h>
#include <stdio.h>
#include <malloc.h>
struct listElementType
{
int data;
listElementType* next;
};
typedef struct listElementType* m_list;
m_list find_the_mth_element_from_end(m_list u_list,int m)
{
m_list p1 = NULL,p2 = NULL;
p1 = u_list;
for (int i = 0; i < m; i++)
{
if (p1->next)
{
p1 = p1->next;
}
else
{
return NULL;
}
}
p2 = u_list;
while (p1->next)
{
p1 = p1->next;
p2 = p2->next;
}
return p2;
}
m_list createList(const int& u_listLength)
{
int i = 0,a = 0;
m_list head = NULL,p1 = NULL,tail = NULL;
for(i = 1; i <= u_listLength; i++)
{
p1 = (m_list)malloc(sizeof(m_list));
if (p1 != NULL)
{
printf("input the %d th number of list:",i);
scanf("%d",&a);
p1->data = a;
if (head == NULL)
{
head = p1;
tail = p1;
}
else
{
tail->next = p1;
tail = p1;
}
tail->next = NULL;
}
else
{
printf("i:%d,p1 malloc error\n",i);
}
}
return head;
}
void freeList(m_list u_list)
{
m_list head,listTmp;
head = u_list;
while (head != NULL)
{
listTmp = head;
head = head->next;
free(listTmp);
listTmp = NULL;
}
listTmp = NULL;
}
void printList(m_list q)
{
while (q)
{
printf("%d ",q->data);
q = q->next;
}
printf("\n");
}
int main(void)
{
m_list u_list = NULL;
int u_listLength = 0;
int u_dstNodePosition = 0;
printf("input the listLength:");
scanf("%d",&u_listLength);
u_list = createList(u_listLength);
if (u_list != NULL)
{
printList(u_list);
printf("input the dstNodePosition:");
scanf("%d",&u_dstNodePosition);
m_list u_destNode = find_the_mth_element_from_end(u_list,u_dstNodePosition);
if (u_destNode)
{
printf("dstNodeData:%d\n",u_destNode->data);
}
else
{
printf("u_dstNodePosition:%d get no Node\n",u_dstNodePosition);
}
freeList(u_list);
}
else
{
printf("list malloc error\n");
return -1;
}
return 0;
}
#include <stdlib.h>
#include <stdio.h>
#include <malloc.h>
struct listElementType
{
int data;
listElementType* next;
};
typedef struct listElementType* m_list;
m_list find_the_mth_element_from_end(m_list u_list,int m)
{
m_list p1 = NULL,p2 = NULL;
p1 = u_list;
for (int i = 0; i < m; i++)
{
if (p1->next)
{
p1 = p1->next;
}
else
{
return NULL;
}
}
p2 = u_list;
while (p1->next)
{
p1 = p1->next;
p2 = p2->next;
}
return p2;
}
m_list createList(const int& u_listLength)
{
int i = 0,a = 0;
m_list head = NULL,p1 = NULL,tail = NULL;
for(i = 1; i <= u_listLength; i++)
{
p1 = (m_list)malloc(sizeof(m_list));
if (p1 != NULL)
{
printf("input the %d th number of list:",i);
scanf("%d",&a);
p1->data = a;
if (head == NULL)
{
head = p1;
tail = p1;
}
else
{
tail->next = p1;
tail = p1;
}
tail->next = NULL;
}
else
{
printf("i:%d,p1 malloc error\n",i);
}
}
return head;
}
void freeList(m_list u_list)
{
m_list head,listTmp;
head = u_list;
while (head != NULL)
{
listTmp = head;
head = head->next;
free(listTmp);
listTmp = NULL;
}
listTmp = NULL;
}
void printList(m_list q)
{
while (q)
{
printf("%d ",q->data);
q = q->next;
}
printf("\n");
}
int main(void)
{
m_list u_list = NULL;
int u_listLength = 0;
int u_dstNodePosition = 0;
printf("input the listLength:");
scanf("%d",&u_listLength);
u_list = createList(u_listLength);
if (u_list != NULL)
{
printList(u_list);
printf("input the dstNodePosition:");
scanf("%d",&u_dstNodePosition);
m_list u_destNode = find_the_mth_element_from_end(u_list,u_dstNodePosition);
if (u_destNode)
{
printf("dstNodeData:%d\n",u_destNode->data);
}
else
{
printf("u_dstNodePosition:%d get no Node\n",u_dstNodePosition);
}
freeList(u_list);
}
else
{
printf("list malloc error\n");
return -1;
}
return 0;
}
相关文章推荐
- 请设计一个既节省时间又节省空间的算法来找出该链表中的倒数第m个元素
- 整数数组中,每个元素均出现两次,除了一个元素例外,如何找出这个元素?能否设计一个线性时间的算法,且不需要额外的存储空间?
- 在一个整型数组中有一个元素的出现次数超过了数组长度的一半,试设计一个 在时间上尽可能高效的算法,找出这个元素。
- 笔试题&面试题:设计一个复杂度为n的算法找到单向链表倒数第m个元素
- 笔试题&面试题:设计一个复杂度为n的算法找到单向链表倒数第m个元素
- 面试-链表逆置 作业手写一个单链表,并且实现单链表元素的逆置,(a0, a1,a2,a3,..an)-> (an,an-1,… a1, a0),算法的空间复杂度和时间复杂度经可能低
- 设计一个复杂度为n的算法找到链表倒数第m个元素,最后一个元素假定是倒数第0个
- 请设计时间和空间上都尽可能高效的算法,求链式存储的线性表的倒数第m个元素
- 一个整数数列,元素取值可能是1~N(N是一个较大的正整数)中的任意一个数,相同数值不会重复出现。设计一个算法,找出数列中符合条件的数对的个数,满足数对中两数的和等于N+1
- 给定一个单向链表L(N0,N1,N2,N3……),在不改变node值得情况下,来编程实现对链表重新排列 ,使得排序后的链表为(N0,Nn,n1,Nn-1,n2,Nn-2……)。
- 长度为n的顺序表L,编写一个时间复杂度为O(n),空间复杂度为O(1)的算法,该算法删除线性表中所有值为X的元素
- 找出单向链表的倒数第m个元素
- 请实现一个算法,在不使用额外数据结构和储存空间的情况下,翻转一个给定的字符串(可以使用单个过程变量)
- 对于一个字符串,请设计一个高效算法,找到第一次重复出现的字符。 给定一个字符串(不一定全为字母)A及它的长度n。请返回第一个重复出现的字符。保证字符串中有重复字符,字符串的长度小于等于500。
- 《数据结构》2.10设计一个算法,删除顺序表中值为item的元素,要求算法的时间复杂度是O(n),空间复杂度是O(1)
- 数组中有一个数字出现的次数超过了数组长度的一半,请找出这个数。java实现
- 给定一个单向链表(长度未知),请遍历一次就找到中间的指针,假设该链表存储在只读存储器,不能被修改
- 试设计一个算法,将数组A(0..n-1)中的元素循环右移k位,并要求空间复杂度为O(1),时间复杂度为O(n)。
- 整型数组处理算法(十)给定数组a[n],其中有超过一半的数为一个定值,找出这个数。[2014人人网笔试题]
- 找出一个无环单链表里面的倒数第K个元素,时间复杂度为O(n)