笔试题&面试题:设计一个复杂度为n的算法找到单向链表倒数第m个元素
2014-12-23 16:02
309 查看
设计一个复杂度为n的算法找到单向链表倒数第m个元素.最后一个元素假定是倒数第0个.
提示:双指针查找
相对于双向链表来说,单向链表仅仅能从头到尾依次訪问链表的各个节点,所以假设要找链表的倒数第m个元素也仅仅能从头到尾进行查找,在查找的过程中,设定两个指针,当中p指针指向当前訪问的节点,q指针指向p之前的节点,且两者之间相距m个节点,这样,当p指针指向最后一个节点时,那q指针指向的元素就是倒数第m个元素,程序的处理步骤例如以下:
提示:双指针查找
相对于双向链表来说,单向链表仅仅能从头到尾依次訪问链表的各个节点,所以假设要找链表的倒数第m个元素也仅仅能从头到尾进行查找,在查找的过程中,设定两个指针,当中p指针指向当前訪问的节点,q指针指向p之前的节点,且两者之间相距m个节点,这样,当p指针指向最后一个节点时,那q指针指向的元素就是倒数第m个元素,程序的处理步骤例如以下:
#include <stdio.h> #include <malloc.h> #define NULL 0 typedef struct node { int data; struct node *next; }ElemSN; void create_link(ElemSN *head, int num[], int len) { int i; for(i = 0; i < len; i ++) { head->next = (ElemSN *)malloc(sizeof(ElemSN)); head->next->data = num[i]; head->next->next = NULL; head = head->next; } } void find_mlink(ElemSN *head, int m) /*最后一个单元为倒数第0个单元*/ { ElemSN *p, *q; int count = 0; for(q = head, p = head->next; p; p = p->next) { count ++; if(count > m) { q = q->next; } } printf("The bottom number %d is: %d.\n", m, q->data); } void clear_link(ElemSN *head) { ElemSN *p, *q; for(q = head, p = head->next; p; q = p, p = p->next) { free(q); } free(q); } int main() { ElemSN *head; int num[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; head = (ElemSN *)malloc(sizeof(ElemSN)); head->data = NULL; head->next = NULL; create_link(head, num, 10); find_mlink(head, 3); /*查找倒数第3个单元的值*/ clear_link(head); head = NULL; return 0; }程序执行截图:
相关文章推荐
- 笔试题&面试题:设计一个复杂度为n的算法找到单向链表倒数第m个元素
- 设计一个复杂度为n的算法找到链表倒数第m个元素,最后一个元素假定是倒数第0个
- 给定一个单向链表(长度未知),请设计一个既节省时间又节省空间的算法来找出该链表中的倒数第m个元素。实现这个算法,并为可能出现的特例情况安排好处理措施。“倒数第m个元素”是这样规定的:当m=0时,链表的
- 请设计一个既节省时间又节省空间的算法来找出该链表中的倒数第m个元素
- [面试题]设计一个算法找到数组中两个元素相加等于指定数的所有组合
- [面试题]设计一个算法找到数组中两个元素相加等于指定数的所有组合
- 每天一个小算法(5)----找到链表倒数第K个结点
- 笔试算法题(05):转换BST为双向链表 & 查找栈中的最小元素
- 数据结构 - 如何删除单向链表的倒数第m个元素?
- 笔试算法题(27):判断单向链表是否有环并找出环入口节点 & 判断两棵二元树是否相等
- 找出单向链表的倒数第m个元素
- 每天一道算法题7 查找链表中倒数第k个结点 ; 输入一个单向链表。如果该链表的结点数为奇数,输出中间的结点;如果链表结点数为偶数,输出中间两个结点前面的一个
- 笔试算法题(19):判断两条单向链表的公共节点 & 字符集删除函数
- 每天学习一算法系列(13) (输入一个单向链表,输出该链表中倒数第k个结点)
- 单向链表的反转是一个经常被问到的一个面试题,也是一个非常基础的问题。比如一个链表是这样的: 1->2->3->4->5 通过反转后成为5->4->3->2->1。
- 从n个元素中选取第k大的元素,设计一个算法并说明算法复杂度
- 找出单向链表的倒数第m个元素
- 已知线性表中元素以值递增有序排列,并以单链表作为存储结构,设计一个算法,删除表中值相同的多余元素
- 如何在单向链表中找到倒数第N个元素
- 试设计一个算法,将数组A(0..n-1)中的元素循环右移k位,并要求空间复杂度为O(1),时间复杂度为O(n)。