输入一个单向链表,输出该链表中倒数第 k 个结点

class ListNode
{
public:
	ListNode()
	{
		pNext	= NULL;
		nValue  = 0;
	}
	ListNode* pNext;
	int nValue;
};
ListNode* CreaList()
{
	int nValue;
	ListNode* Head = NULL;
	ListNode* ListIndex = NULL;
	while(cin >> nValue)
	{
		if (Head == NULL)
		{
			Head = new ListNode();
			Head->nValue = nValue;
			ListIndex = Head;
		}
		else
		{
			ListNode* newNode = new ListNode();
			newNode->nValue = nValue;
			ListIndex->pNext = newNode;
			ListIndex = newNode;
		}
	}

	//
	cout << "Print List;" << endl;
	PrintList(Head);

	return Head;
}

void PrintList(ListNode* Head)
{
	for (ListNode* pNode = Head; pNode != NULL; pNode = pNode->pNext)
	{
		cout << pNode->nValue << " ";
	}
	cout << endl;
}

//运用两个节点 可以达到通过一次遍历完成输出倒数第K个节点
void PrintTheLastK(ListNode* Head, int K)
{
	if (Head == NULL)
	{
		cout << "number of list less then " << K << endl;
		return;
	}

	ListNode*  firstPoint = Head;
	ListNode*  secondPoint = Head;

	for (int i = 1; i < K ; i++)
	{
		secondPoint = secondPoint->pNext;
		if (secondPoint == NULL)
		{
			cout << "number of list less then " << K << endl;
			return;
		}
	}

	while(1)
	{
		if (secondPoint->pNext == NULL)
		{
			cout << "result:" << firstPoint->nValue << endl;
			return;
		}
		firstPoint = firstPoint->pNext;
		secondPoint = secondPoint->pNext;
	}
}
//拓展
//输入一个单向链表。如果该链表的结点数为奇数,输出中间的结点;如果链表结点数为偶数,输出中间两个结点前面的一个
void PrintMidNode(ListNode* Head)
{
	if (Head == NULL)
	{
		return;
	}

	ListNode* firstNode = Head;
	ListNode* secondNode = Head;

	while (1)
	{
		if (secondNode->pNext == NULL || secondNode->pNext->pNext == NULL)
		{
			cout << "result:" << firstNode->nValue << endl;
			return;
		}

		secondNode = secondNode->pNext->pNext;
		firstNode  = firstNode->pNext;
	}
}



版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-07 08:03:53

输入一个单向链表,输出该链表中倒数第 k 个结点的相关文章

【编程题目】输入一个单向链表,输出该链表中倒数第 k 个结点

第 13 题(链表):题目:输入一个单向链表,输出该链表中倒数第 k 个结点.链表的倒数第 0 个结点为链表的尾指针.链表结点定义如下: struct ListNode {int m_nKey;ListNode* m_pNext;}; 我的思路:先翻转链表,再从翻转后的链表的头向尾数k-1个,返回,再次翻转链表. 代码如下:注意这个思路非常差.差的原因是:如果只是用最原始的方法,先遍历一遍计数,再遍历一遍找倒数第k个,需要遍历两遍.但我的思路,翻转两次链表就要遍历两遍.还要在走k-1步找倒数第k

13输入一个单向链表,输出该链表中倒数第k个结点。链表的倒数第0个结点为链表的尾指针。

转载请注明出处:http://www.cnblogs.com/wuzetiandaren/p/4250795.html 声明:现大部分文章为寻找问题时在网上相互转载,此博是为自己做个记录记录,方便自己也方便有类似问题的朋友,本文的思想也许有所借鉴,但源码均为本人实现,如有侵权,请发邮件表明文章和原出处地址,我一定在文章中注明.谢谢. 题目:输入一个单向链表,输出该链表中倒数第k个结点.链表的倒数第0个结点为链表的尾指针. 题目分析: 1.链表的倒数第0个结点为链表的尾指针,设为r,则r指向最后一

剑指offer14:输入一个链表,输出该链表中倒数第k个结点。

1. 题目描述 输入一个链表,输出该链表中倒数第k个结点. 2. 思路和方法 可以用两个指针,一个指针遍历到第k个结点的时候,第二个指针再走到第一个节点,然后两个指针的距离始终保持k-1.这样,当第一个指针的next==NULL,也就是走到最后一个节点的时候,第二个指针对应的位置,就是倒数第k个结点.这样的好处是能够节省一个循环,时间复杂度会相应降低,从Q(2N) 降低到到Q(N). 注意,但是需要一个小循环让第一个指针先走到第k个指针.同时也存在结点总数小于k的问题,如果循环还没有进行到k次,

【华为OJ】【035-输出单向链表中倒数第k个结点】

[华为OJ][算法总篇章] [华为OJ][035-输出单向链表中倒数第k个结点] [工程下载] 题目描述 输入一个单向链表,输出该链表中倒数第k个结点,链表的倒数第0个结点为链表的尾指针. 输入描述 输入说明 1 输入链表结点个数 2 输入链表的值 3 输入k的值 输出描述 输出一个整数 输入例子 8 1 2 3 4 5 6 7 8 4 输出例子 4 算法实现 import org.omg.SendingContext.RunTime; import java.util.List; import

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

题目:输入一个单向链表,输出该链表中倒数第k个结点.最后一个结点为倒数第一个结点. 思路: 1.首先遍历链表的长度获得链表的length,则它的倒数第k个结点就是正数length-k+1个结点,但这需要遍历链表两次 2.使用两个指针可以实现遍历一次,first指针指向头结点,second指针指向first之后的k-1个结点,然后两个结点循环向后移动,直到second结点到达链表的最后一个结点时,first结点指向倒数第k个结点. 注意: 1.要判断传来的参数 *head和k是否合法 2.判断k是

输入一个字符串,输出该字符串中对称的子字符串的最大长度。

public class LongestSymmtricalLength2 { /* * Q75题目:输入一个字符串,输出该字符串中对称的子字符串的最大长度. * 比如输入字符串“google”,由于该字符串里最长的对称子字符串是“goog”,因此输出4. */ public static void main(String[] args) { String[] strs = { "a","google", "elgoog", "agol

IT公司100题-13-求链表中倒数第k个结点

问题描述: 输入一个单向链表,输出该链表中倒数第k个结点.链表倒数第0个节点为NULL. struct list_node { int data; list_node* next; }; 分析: 方法1: 首先计算出链表中节点的个数n,然后倒数第k个节点,为正数n-k+1个节点. 需要遍历链表2次. 方法1代码实现: 1 // 13_1.cc 2 #include <iostream> 3 using namespace std; 4 5 struct list_node { 6 int da

剑指Offer面试题15(Java版):链表中倒数第K个结点

题目: 输入一个链表,输出该链表中倒数第k哥结点. 为了符合大多数人的习惯,本题从1开始计数,即链表的尾结点是倒数第1个结点. 例如一个链表有6个结点,从头结点开始它们的值依次是1,2,3,4,5,6.这个链表的倒数第3个结点是值为4的结点 为了得到第K个结点,很自然的想法是先走到链表的尾端,再从尾端回溯K步.可是我们从链表结点的定义可疑看出本题中的链表 是单向链表,单向链表的结点只有从前往后的指针而没有从后往前的指针,因此这种思路行不通. 既然不能从尾节点开始遍历这个链表,我们还是把思路回到头

第13题:取链表中倒数第K个结点

欢迎转载,转载请务必注明出处:http://blog.csdn.net/alading2009/article/details/45037001 第13题:输入一个单向链表,输出该链表中倒数第K个结点.链表的倒数第0个结点为链表的尾指针. 考虑如何在程序执行中保留K这个信息,这儿使用两个坐标,要让这两个坐标之间相距K个距离,于是当前一个坐标到达尾指针时,后一个坐标恰好与尾相距K个结点距离. 代码 package test013; import test007.Node; /** * Create

剑指offer编程-链表中倒数第k个结点

题目描述 输入一个链表,输出该链表中倒数第k个结点. 思路: 1.遍历链表得到链表的长度l,找到从前往后的第l-k+1个节点.需要遍历两遍. 2.遍历一次即可的方法:两个指针,第一个指针从头向尾移动k-1步后第二个指针开始从头向尾移动,第一个指针到尾结点时第一个指针指向倒数第k个结点. ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) { if(pListHead==NULL || k==0) return NULL; Li