查找单链表的第k个结点

原创 2013年12月03日 16:14:43

题目:输入一个单向链表,输出该链表中倒数第k个结点。链表的倒数第0个结点为链表的尾指针。链表结点定义如下:

struct ListNode
{
    int       m_nKey;
    ListNode* m_pNext;
};

解析:方案一:可以对单链表来个逆置,然后再取逆置后的单链表的第k个元素。但是这样,在逆置的过程中涉及到大量的插入和删除的工作,实为不佳的方案。

     方案二:可以先求出链表的长度,然后求第n-k-1个结点即可。但是这需要遍历链表两遍,对于长度很大的链表来说,不是一个很好的方法。

     方案三:寻求只需遍历链表一遍的方法。维持两个指针p和q,p指针遍历链表,到第k-1个结点时,q开始从第1个结点开始与p一起前移,直至p指向了尾结点,那么q便指向了倒数第k个结点。

// 8_返回单链表倒数第k个结点.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"

#include <iostream>

using namespace std;

typedef struct Node
{
	int key;
	struct Node *next;
}Node;

Node *head = NULL;

void createList()
{
	Node *p = NULL, *q = NULL;
	head = new Node;
	head->next = NULL;
	q=head;
	cout<<"input the key:"<<endl;
	int a_in = 0;
	cin>>a_in;
	while(a_in!=-1)
	{
		p = new Node;
		p->key = a_in;
		q->next = p;
		p->next = NULL;
		q = p;
		cout<<"input the key:"<<endl;
		cin>>a_in;
	}

}

Node * GetKNode(int k)
{
	Node *first = NULL, *second = NULL;
	first = second = head;
	int count = 0;
	while(count<k-1)
	{
		first = first->next;
		count++;
	}
	while(first->next!=NULL)
	{
		first = first->next;
		second = second->next;
	}
	return second;

}

void PrintList()
{
	Node *p = head->next;
	while(p!=NULL)
	{
		cout<<p->key<<",";
		p = p->next;
	}
}

int _tmain(int argc, _TCHAR* argv[])
{
	createList();
	PrintList();
	cout<<"倒数第5个结点的值:"<<GetKNode(5)->key<<endl;
	return 0;
}


相关文章推荐

【融博笔试题】查找单链表倒数第k个结点的值

继华赛之后,又一次倒在面试门前。基础不扎实就是不行啊! 下来做完这道题,顺便复习单链表。代码如下:   //-------------------------------------------...

查找并输出单链表的倒数第k个结点

要输出单链表的倒数第k个结点,可以先遍历整个链表,求出链表大小,假设链表大小是n,再次遍历链表n-k+1次,这个链表就是我们要输出的链表结点,但是发现实现这个功能需要遍历两次。改进一次遍历完成输出倒数...

查找单链表中倒数第k个结点

本文转自:程序员面试题6--查找链表中倒数第k个结点 题目:输入一个单向链表,输出该链表中倒数第k个结点。链表的倒数第0个结点为链表的尾指针。链表结点定义如下: struct ListNode {...

查找倒数第N个结点(单链表)

  • 2014年12月26日 16:51
  • 1KB
  • 下载

有关单链表的两个问题【遍历一次求中间节点,倒数第K个结点】

package com.zhiru; /* * 一个无附加头结点的单向链表示例 */ public class LinkedList { private Node head; private...

链表面试题---删除倒数第k个结点、逆置单链表

要删除链表倒数第k个结点,需满足下述条件: 1、链表不能为空; 2、k不能等于0; 3、k不能大于链表的结点总数(链表长度) 删除时,应先找到倒数第k个结点,并标记该结点的前一个结点和后一个结...

求单链表中倒数第k个结点

题目:实现一个算法,找出单链表中倒数第k个结点。 解法:        下面以递归和非递归的方式解决这个问题。一般来说,递归解决更简洁,但是效率比较差。 例如,就这个问题来说,递归解法的代码量大概只有...

输出单链表中倒数第k个结点

题目:输入带头结点的单链表L,输出该单链表中倒数第k个结点。单链表的倒数第0个结点为该单链表的尾指针。要求只能遍历一次单链表。 解题思路: 如果不要求只能遍历一次单链表,我们可以先遍历一次单链表,...

输出单链表中倒数第k个结点(Java版)

题目:输入带头结点的单链表L,输出该单链表中倒数第k个结点。单链表的倒数第0个结点为该单链表的尾指针。要求只能遍历一次单链表。 解题思路: 如果不要求只能遍历一次单链表,我们可以先...

链表面试题(六)---删除单链表倒数第k个结点

一、结构体定义typedef int DataType;typedef struct ListNode//定义结点 { DataType data; struct ListNode* ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:查找单链表的第k个结点
举报原因:
原因补充:

(最多只允许输入30个字)