CareerCup之2.2 寻找单链表倒数第n个元素

【题目】

原文:

2.2 Implement an algorithm to find the nth to last element of a singly linked list.

译文:

实现一个算法从一个单链表中返回倒数第n个元素。

【分析】

(1)创建两个指针p1和p2,指向单链表的开始节点。

(2)使p2移动n-1个位置,使之指向从头开始的第n个节点。(意思是就是使p1和p2距离n个位置)

(3)接下来检查p2 - > = = null 如果yes返回p1的值,否则继续移动p1和 p2 如果接下来p2为null意味着p1指向从结尾开始计算的第n个节点。

(4)重复第三步

【代码】

/*********************************
*   日期:2014-5-18
*   作者:SJF0115
*   题目: 寻找单链表倒数第n个元素
*   来源:CareerCup
**********************************/
#include <iostream>
#include <algorithm>
#include <string.h>
using namespace std;

struct ListNode {
    int val;
    ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};

ListNode* nthToLast(ListNode* head,int n){
    //head 带有头结点的单链表
    if(head->next == NULL || head == NULL || n <= 0){
        return NULL;
    }
    int i;
    ListNode* p1 = head->next;
    ListNode* p2 = head->next;
    //p2移动n-1个位置
    for(i = 1;i <= n-1;i++){
        //总共元素不到n个
        if(p2 == NULL){
            return NULL;
        }
        p2 = p2->next;
    }
    //p2移动至末尾则p1移动到倒数第n个元素
    while(p2->next != NULL){
        p1 = p1->next;
        p2 = p2->next;
    }
    return p1;
}

int main(){
    int i,j;
    //freopen("C:\\Users\\XIAOSI\\Desktop\\acm.txt","r",stdin);
    ListNode *head = (ListNode*)malloc(sizeof(ListNode));
    head->next = NULL;
    ListNode *node;
    ListNode *pre = head;

    int A[] = {6,5,3,3,6,5,6,7,3,7,1,2,1,4,6,7,2,3};

    for(int i = 0;i < 18;i++){
        node = (ListNode*)malloc(sizeof(ListNode));
        node->val = A[i];
        node->next = NULL;
        pre->next = node;
        pre = node;
    }

    node = nthToLast(head,18);
    if(node != NULL){
        cout<<node->val<<endl;
    }
    else{
        cout<<""<<endl;
    }
    return 0;
}

CareerCup之2.2 寻找单链表倒数第n个元素

时间: 2024-10-29 03:39:19

CareerCup之2.2 寻找单链表倒数第n个元素的相关文章

链表习题(8)-寻找单链表中数据域大小为k的结点,并与前一结点交换,如果前一结点存在的情况下

1 /*寻找单链表中数据域大小为k的结点,并与前一结点交换,如果前一结点存在的情况下*/ 2 /* 3 算法思想:定义两个指针,pre指向前驱结点,p指向当前结点,当p->data == k的时候,交换 4 pre->data和p->data 5 */ 6 void SwapData(LinkList& L, int k) 7 { 8 LNode *pre = L, *p = L->next; 9 int temp; 10 while (p) 11 { 12 if (p-&

数据结构-寻找单链表的中间元素

1:这里使用一个只用一遍扫描的方法.描述如下: 假设mid指向当前已经扫描的子链表的中间元素,cur指向当前已扫描链表的末节点,那么继续扫描即移动cur到cur->next,这时只需判断一下应不应该移动mid到mid->next就行了.所以一遍扫描就能找到中间位置.代码如下: // ConsoleApplication15.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <malloc.h> #inclu

从单链表中删除最大的元素,单链表元素排序

public class LinkList { public Node head; public LinkList() { head = new Node(); head.next = null; } //尾插法 public void createByTail(int[] arr, int n) { Node tail = head; for(int i=0; i<n; i++) { Node c = new Node(arr[i]); tail.next = c; tail = c; } t

求单链表倒数第k个结点

题目: 输入一个单向链表,输出该链表中倒数第k个结点,链表的倒数第0个结点为链表的尾指针. 分析: 设置两个指针p1,p2.首先p1和p2都指向head.然后p2向前走k步,这样p1和p2之间就间隔k个节点,然后p1和p2同.... #include<iostream> #include<stdio.h> #include<stdlib.h> using namespace std; struct ListNode{ char data; ListNode* next;

单链表倒数第K个节点的查找和显示

1.使用一个固定长度队列装链表段,当遍历到链表根时,返回队列头元素. class Node{ int value; Node next; public Node(int value){ this.value=value; } } public class Danlianbiao { public static void main(String[] args) { Node node=new Node(1); Node node2=node.next=new Node(2); Node node3

数据结构之 线性表---单链表的应用(重复元素删除)

数据结构上机测试1:顺序表的应用 Time Limit: 1000MS Memory limit: 65536K 题目描述 在长度为n(n<1000)的顺序表中可能存在着一些值相同的“多余”数据元素(类型为整型),编写一个程序将“多余”的数据元素从顺序表中删除,使该表由一个“非纯表”(值相同的元素在表中可能有多个)变成一个“纯表”(值相同的元素在表中只能有一个). 输入 第一行输入表的长度n: 第二行依次输入顺序表初始存放的n个元素值. 输出 第一行输出完成多余元素删除以后顺序表的元素个数: 第

对带头结点的单链表的简单操作

#pragma once #include<stdio.h> #include<stdlib.h> #include<assert.h> #include<memory.h> #define DataType int           //int 可以改写为其它数据类型 typedef struct Node { DataType data; struct Node *next; }Node,*pNode;          //定义结点结构体      

数据结构(一) 单链表的实现-JAVA

数据结构还是很重要的,就算不是那种很牛逼的,但起码得知道基础的东西,这一系列就算是复习一下以前学过的数据结构和填补自己在这一块的知识的空缺.加油.珍惜校园中自由学习的时光.按照链表.栈.队列.排序.数组.树这种顺序来学习数据结构这门课程把. -WH 一.单链表的概念 链表是最基本的数据结构,其存储的你原理图如下图所示 上面展示的是一个单链表的存储原理图,简单易懂,head为头节点,他不存放任何的数据,只是充当一个指向链表中真正存放数据的第一个节点的作用,而每个节点中都有一个next引用,指向下一

java数据结构:单链表常见操作代码实现

一.概述: 本文主要总结单链表常见操作的实现,包括链表结点添加.删除:链表正向遍历和反向遍历.链表排序.判断链表是否有环.是否相交.获取某一结点等. 二.概念: 链表: 一种重要的数据结构,HashMap等集合的底层结构都是链表结构.链表以结点作为存储单元,这些存储单元可以是不连续的.每个结点由两部分组成:存储的数值+前序结点和后序结点的指针.即有前序结点的指针又有后序结点的指针的链表称为双向链表,只包含后续指针的链表为单链表,本文总结的均为单链表的操作. 单链表结构: Java中单链表采用No