每日编程14之取单链表中间元素
2013-03-08 10:44
141 查看
我的直观想法是遍历单链表,统计元素个数,然后确定中间元素的位置,在此进行遍历。。。
看到的比较精妙的算法是,用二个指针first,second分别走一步,二步。。当second走到队尾/接近的时候,first应该就是中间/接近中间元素的位置
这里的关键是,处理"接近"这个模糊的概念。。。
来二个图,直观的展示一下..
首先是元素个数分别为偶数/奇数个的情况
所以每次都要判断second->next==NULL || second->next->next==NULL 若此条件满足,则first指针即为中间元素,否则second=second->next->next,first=first->next
还要考虑几种特殊情况:
(1)head==NULL,没有中间元素,return NULL
(2)只有一个元素,满足前述条件中的second->next==NULL,retrun first
(3)只有二个元素,满足second->next->next==NULL,return first
(4)三个或三个以上的元素,同样满足条件
上述归纳证明了算法的正确性
核心代码:
struct node* linkList_midElement(struct node* head)
{
if(!head) return NULL;
struct node *first;
struct node *second;
first=second=head;
while((second->next)&&(second->next->next))
{
second = second->next->next;
first = first->next;
}
return first;
}
OVER!!!
面对这个题目要求,还是展现了我现在见识/积累不够,思维局限性比较大。。好在总算还有解决方案,尽管有些贻笑大方。。。
看到的比较精妙的算法是,用二个指针first,second分别走一步,二步。。当second走到队尾/接近的时候,first应该就是中间/接近中间元素的位置
这里的关键是,处理"接近"这个模糊的概念。。。
来二个图,直观的展示一下..
首先是元素个数分别为偶数/奇数个的情况
所以每次都要判断second->next==NULL || second->next->next==NULL 若此条件满足,则first指针即为中间元素,否则second=second->next->next,first=first->next
还要考虑几种特殊情况:
(1)head==NULL,没有中间元素,return NULL
(2)只有一个元素,满足前述条件中的second->next==NULL,retrun first
(3)只有二个元素,满足second->next->next==NULL,return first
(4)三个或三个以上的元素,同样满足条件
上述归纳证明了算法的正确性
核心代码:
struct node* linkList_midElement(struct node* head)
{
if(!head) return NULL;
struct node *first;
struct node *second;
first=second=head;
while((second->next)&&(second->next->next))
{
second = second->next->next;
first = first->next;
}
return first;
}
OVER!!!
面对这个题目要求,还是展现了我现在见识/积累不够,思维局限性比较大。。好在总算还有解决方案,尽管有些贻笑大方。。。
相关文章推荐
- 面试题之链表问题 - 找出倒数第k个元素(或中间元素)
- 每日一题14:数组与链表组合方案下的Josephus问题
- 编程菜鸟的日记-初学尝试编程-链表元素快速排序
- 编码实现环状单向链表(尾指针直接指向头指针,中间没有空节点),去除连续的重复元素的操作
- 找到单项链表中间那个元素,如果有两个则取前面一个
- 算法分析-查找单链表中的倒数第k个元素和中间元素
- Q:链表的中间元素
- (学习java)写一个完整的程序,实现随机生成20个元素的链表,快速查找中间结点的值并显示
- 软件开发者面试百问-----怎样找出链表中间的元素?
- 单向链表O(1)删除中间元素
- 第十三节 机试题之 遍历单链表一次,找出链表中间元素
- 已知两个链表 la和 lb,其元素值递增排序。编程将la和lb合并成一个递减有序(相同值元素只保留一个)的链表lc。(北方名校经典试题) 本题选做
- 编码实现环状单向链表(尾指针直接指向头指针,中间没有空节点),去除连续的重复元素的操作。
- 删除一个单项链表的最中间的元素,要求时间尽可能短(不能使用两次循环)
- 四道有趣的单链表面试题(单链表反序、找出链表的中间元素、链表排序、判断一个单链表是否有环)
- 四道有趣的单链表面试题(单链表反序、找出链表的中间元素、链表排序、判断一个单链表是否有环)
- 四道有趣的单链表面试题(单链表反序、找出链表的中间元素、链表排序、判断一个单链表是否有环)
- 删除链表的中间节点(每日一道算法题)
- 删除一个单项链表的最中间的元素,要求时间尽可能短(不能使用两次循环)java
- 数据结构链表 -- 查找倒数第N个元素、中间元素、创建链表