求链表倒数第几个节点

使用两个指针,和判断一个链表是否形成环类似

代码:

#include <iostream>
#include <list>
using namespace std;

typedef struct node {
	int data;
	struct node  *next ;
}Node,*pNode;

void creatNode( pNode &pHead ){
	bool isFirst=true;
	pNode p,q;
	int temp;
	scanf("%d",&temp);
	while(temp){
		p=(pNode)malloc(sizeof(Node));
		p->data = temp;
		p->next = NULL;
		if(isFirst){
			q=pHead=p;
			isFirst = false;
		}else{
			q->next = p;
			q = p;
		}
		scanf("%d",&temp);
	}
}

void print(pNode p){
	while(p){
		cout<<p->data << " ";
		p = p->next;
	}

}

pNode printLast(pNode pHead,unsigned int m){
	if(NULL == pHead || m==0)
		return NULL ;
	pNode pAhead = pHead;
	pNode pBehind = pHead;
	for(int i=1;i<=m;i++){
		if(pAhead->next != NULL)
			pAhead = pAhead->next;
		else
			return NULL;

	}
	while(pAhead){
		pAhead = pAhead->next;
		pBehind = pBehind->next;
	}
	return pBehind;
}

int main()
{
	pNode pHead=NULL;
	creatNode(pHead);
	print(pHead);
    cout<<endl<< printLast(pHead,2)->data;
    return 0;
}

运行结果:

求链表倒数第几个节点,布布扣,bubuko.com

时间: 2024-11-05 00:54:08

求链表倒数第几个节点的相关文章

【剑指offer】链表倒数第k个节点

转载请注明出处:http://blog.csdn.net/ns_code/article/details/25662121 在Cracking the Code Interview上做过了一次,这次在九度OJ上测试,AC. 题目描述: 输入一个链表,输出该链表中倒数第k个结点.(hint: 请务必使用链表.) 输入: 输入可能包含多个测试样例,输入以EOF结束.对于每个测试案例,输入的第一行为两个整数n和k(0<=n<=1000, 0<=k<=1000):n代表将要输入的链表元素的

lintcode 容易题:nth to Last Node In List 链表倒数第n个节点

题目: 链表倒数第n个节点 找到单链表倒数第n个节点,保证链表中节点的最少数量为n. 样例 给出链表 3->2->1->5->null和n = 2,返回倒数第二个节点的值1. 解题: 某年408计算机考研题目 Java程序: /** * Definition for ListNode. * public class ListNode { * int val; * ListNode next; * ListNode(int val) { * this.val = val; * thi

LintCode 链表倒数第n个节点

找到单链表倒数第n个节点,保证链表中节点的最少数量为n. 样例 给出链表 3->2->1->5->null和n = 2,返回倒数第二个节点的值1. 分析:设两个指针 p1和p2,p1遍历到n-1的位置,p2从头开始遍历 当p1到链表尾部的时候,p2刚好到倒数n的位置 注意鲁棒性的考虑 /** * Definition of ListNode * class ListNode { * public: * int val; * ListNode *next; * ListNode(in

算法题:求链表倒数第K个结点

说明:本文仅供学习交流,转载请标明出处,欢迎转载!  题目:给出一个单链表,返回倒数第K个结点,最后一个结点为倒数第1个. <剑指offer>上面给的解法是设置两个指针,这里记为p1.p2,先让p2走(k-1)步,然后p1.p2同时走,当p2走到最后一个结点时,p1所指向的结点就是倒数第k个结点. 我觉得按照这样的逻辑写代码反而更容易出错,因为我们需要把我两件重要的问题:(1).p2先走(k-1)步:(2)循环结束的条件是p2到达最后一个结点,即p2->next==NULL.显然这样不太

LintCode 166. 链表倒数第n个节点

找到单链表倒数第n个节点,保证链表中节点的最少数量为n. 样例 给出链表 3->2->1->5->null和n = 2,返回倒数第二个节点的值1. /** * Definition of ListNode * class ListNode { * public: * int val; * ListNode *next; * ListNode(int val) { * this->val = val; * this->next = NULL; * } * } */ cla

求链表的第一个公共节点

求链表的第一个公共节点主要思想 有如下两个链表: 有以下两种方法 上述链表,有一种蛮力方法,就是从一个链表中每一个节点,与另外链表中的节点,去比较, 如果从中找到相同的节点,表示有公共节点,这个算法时间复杂度为O(n*m),两个链表的长度分别为n,m 如果使用快慢指针,让链表长的指针,先走,走的步数就为,两者长度差,如果两者有相同节点,必然会在一个地方,相遇, 该算法的时间复杂度为O(max(n,m)) 方法2 的实现代码为: /* struct ListNode { int val; stru

单链表的经典操作,查找链表倒数第k个节点,判断链表是否存在环,求环节点

#include<stdio.h>#include<stdlib.h> typedef struct date_list{    int data;    struct date_list* next;}mylist; mylist* creatlist(int x,mylist* p)        //用一个元素创建链表{    if(NULL == p)                         //链表创建必须判空    {        p = malloc(siz

求链表的第一个公共节点问题(好未来笔试题)

问题描述:给定两个链表的头指针,判断两个链表是否存在公共节点,如果存在公共节点,则找出第一个公共节点. 分析:这曾经是我参加好未来的一道笔试题目,给大家分享下解法. 解法一:蛮力法.拿第一个链表的每个节点去和第二个链表的每个节点进行比较,如果都不相同,则判断出两个链表不相交. 否则输出第一个相同的节点.算法的时间复杂度为O(m*n). 解法二:辅助空间法.仔细观察可以发现,如果两个链表想要相交,则尾节点必是相交点,否则不相交. 因此我们可以从两个链表的尾部开始进行比较,如果不相同,直接判断出不相

链表(5)----查找链表倒数第K个节点

1.链表定义 typedef struct ListElement_t_ { void *data; struct ListElement_t_ *next; } ListElement_t; typedef struct List_t_{ int size; int capacity; ListElement_t *head; ListElement_t *tail; } List_t; 2.查找链表第K个节点数据 设置快慢指针,快指针超前慢指针k-1个节点,然后快慢指针再同时遍历链表,当快指