《程序员面试金典》--找出链表中倒数第k个节点

来源:互联网 发布:java concurrent i自增 编辑:程序博客网 时间:2024/06/03 08:09

题目描述:

   给定一个单向链表的头结点,找出链表中倒数第k个节点

方法1(求长度):

可以首先遍历链表,求出链表的长度L,再继续从头节点开始遍历一次链表,走到L-K的位置便是所求的节点。这样就要遍历两次链表O(2N);

方法2(递归实现):

递归遍历链表,当达到链表末尾时候,传递一个值为0的计数器,之后每次调用将该计数器加1,当计数器等于k时,便将该节点返回,只需要遍历一次链表,但是需要递归遍历消耗栈空间。

代码实现如下:

BiTree* find1(BiTree* head,int k, int &i){if(head==NULL)return NULL;BiTree *nd=find1(head->next,k,i);++i;if(i==k)return head;return nd;}

方法3(快慢指针实现):

可以两个移动的指针实现,先让第一个指针遍历k个节点,然后第二个指针从头结点和第一个指针同步移动,当第一个指针达到指针末尾的时候,第二个指针便是倒数第k个节点,这样只需要一次遍历链表,而且空间复杂度为O(1)。

代码实现如下:

class Solution {public:    ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {        int count=1;        ListNode* head=pListHead;        if(!pListHead)            return NULL;        while(pListHead->next!=NULL){            count++;         pListHead=pListHead->next;        }        if(count<k)            return NULL;        int i=1;        while(i++<count-k+1){            head=head->next;        }        return head;    }};




0 0
原创粉丝点击