您的位置: 题酷首页 » 所有题目 » 面试题之链表问题 - 找出倒数第k个元素(或中间元素)


面试题之链表问题 - 找出倒数第k个元素(或中间元素)


0
0
3 答
954 看

设计一个算法,找出一个无环的单链表里面倒数第k个元素

速度要快!

BTW:如果要找中间的那个呢?

面试题微软链表查找
2009/08/18 by 半瓶墨水 6个月前更新 更新记录



3

用两个指针,其中间间隔距离是K, 当前面的指针指到链表尾,后面的链表就指向第K个元素。

0

Haskell的。思路是做一个临时列表,用来保存K个元素,一旦到达链表底部,就返回临时列表的第一个元素。不知道是不是还有更好的做法。

findK :: [a] -> Int -> a
findK x k = findK' x k []

findK' :: [a] -> Int -> [a] -> a
findK' [] k a
    | k > 0 = error "This list hasn't K element"
    | otherwise = head a
findK' (x:xs) k a
    | k <= 0 = findK' xs (k - 1) (tail(a ++ [x])) --如果列表已满,加入当前元素,并弹出第一个元素
    | otherwise = findK' xs (k - 1) (a ++ [x]) --加入当前元素到临时列表
3 有O(1)的方法的。仔细想想,其实你只需要那个临时列表中的第一个元素...半瓶墨水, 6个月前
呵呵,Thanks very much. 我想明白了,我这里其实并没有用到真正的单链表,只是用了Haskell自身的列表,因而没有了从某一元素直接取其下一元素的能力。看来我要必要自己先实现一个单链表才行。ytll21, 6个月前
1 语法高亮的经典问题。 ' 同时是字符的分隔符与标识符的后缀。leaveye, 6个月前
0

找中间元素的思路差不多,区别在于在当前位置为奇数时弹出临时列表的第一个元素。

findMiddle :: [a] -> a
findMiddle [] = error "This list is empty."
findMiddle x = findMiddle_sub x [] 1

findMiddle_sub :: [a] -> [a] -> Int -> a
findMiddle_sub [] a position = head a
findMiddle_sub (x:xs) a position
    | position == 1 || even position = findMiddle_sub xs (a ++ [x]) incrPos
    | otherwise = findMiddle_sub xs (tail(a ++ [x])) incrPos
    where incrPos = position + 1
同上半瓶墨水, 6个月前

250x

参与回答

 提示:如不是回答问题,请采用发表评论形式! (比如针对题目或者某个回复的意见、建议)

注册登录后再回答