链表的巧解



直观地想,如果想得到倒数第k 个节点,那么从后面往前数k个啰?这个不行,单向链表

是行不通的,那么也可以这样,设有n个节点,那么向前往后数n-k+1个吧。但是这种方法

要两次遍历链表,第一次是获得链表节点的个数n.第二次才找到倒数第k个节点。

比较巧的方法是:

设两个指针,一个指各头,另一个与前一个指针相隔k-1个节点,则当后面那个指针

指向尾的时候,前面那个就指向了倒数第k个节点了。

注意代码的鲁棒性:

  1. #ifndef COUNT_BACKWARD_H
  2. #define COUNT_BACKWARD_H
  3. #include<iostream>
  4. struct ListNode
  5. {
  6. int m_value;
  7. struct ListNode *m_pNext;
  8. };
  9. ListNode *findBackward_k(ListNode **head,int k_backward){
  10. if(head==NULL||*head==NULL||k_backward==0){
  11. return NULL ;
  12. }
  13. if((*head)->m_pNext==NULL&&k_backward==1){
  14. return *head;
  15. }
  16. ListNode *m_phead=*head;
  17. ListNode *pre_kbackward=m_phead;
  18. ListNode *m_pend=m_phead-1;
  19. int count_dis=k_backward;
  20. while(m_pend->m_pNext!=NULL){
  21. if(count_dis>0){
  22. m_pend=m_pend->m_pNext;
  23. count_dis--;
  24. continue;
  25. }
  26. pre_kbackward=pre_kbackward->m_pNext;
  27. m_pend=m_pend->m_pNext;
  28. }
  29. if(count_dis!=0){
  30. throw("invalid input value");
  31. }
  32. return pre_kbackward;
  33. }
  34. #endif

发散思维:

来自为知笔记(Wiz)

时间: 2024-10-14 19:47:28

链表的巧解的相关文章

leetcode之反转链表图文详解

206-反转链表 题目: 反转一个单链表. 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 思路: 迭代法: 新建一个链表的头部,循环遍历旧链表的结点,将其加到新链表的后面 递归法 代码:(迭代法) /** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; *

链表程序详解Linklist.c

#include <stdio.h> #include <stdlib.h> typedef int datatype; typedef struct node/*链表的每一个节点都是结构体*/ { datatype data; struct node *next; }linklist;/*linklist 是struct node 的别名,以后就可以用linklist来替代struct node*/ /*函数声明区*/ linklist * list_create(); int

Java单向链表操作详解

转自:http://blog.csdn.net/zxman660/article/details/7786354 —————————————————————————————————————————— /* 先定义一个Node类用来存储节点的值域和指针域 * 即当前节点中的值和后面节点的方法 * 在C中就是相当与定义一个结构体类型一个数据域和指针域的方法 */ class LNode{//这个写法已经非常固定了 设置两个属性分别用set函数和get函数来得到这两个属性 private int da

内核链表函数详解

内核中经常采用链表来管理对象,先看一下内核中对链表的定义    struct list_head {        struct list_head *next, *prev;    }; 一般将该数据结构嵌入到其他的数据结构中,从而使得内核可以通过链表的方式管理新的数据结构,看一个例子: struct example {        member a;        struct list_head list;        member b;    }; 1.链表的定义和初始化 您可以通过

链表结构详解

链表是最简单的动态数据结构,数据存储在节点(Node)中,其节点的数据结构如下: class Node{ E e;//数据存储的地方 Node next;//也是一个节点,他指向当前节点的下一个节点 } 我们可以把链表理解成为一个火车,每个链表,其实就是一节车厢,数据存储在车厢中中,而每个火车节都有一个指针,连接着下一个火车节. 链表有一个优点: 真正的动态数据结构,无需关系创建的空间是否过大,不需要像数据一样担心容量的问题. 缺点: 不能像数组那样,给一个索引就能查找到指定的值. 链表和数组的

poj 2495 Incomplete chess boards 覆盖问题巧解

题意: 给一个8*8的棋盘,上面有2格被挖掉,判断是否可以用1*2的长方形覆盖棋盘. 分析: poj2446用的二分图匹配是这一类问题的通解.但这题只有恰好2个点被挖,所以有简便做法.可以把整个棋盘黑白染色(就像国际象棋那样),如果挖去的同色,则无法覆盖(这样导致剩余黑色格子数不等于白色格子数,每个1*2的长方形恰好覆盖一个黑色格和一个白色格). 代码: //poj 2495 //sep9 #include<iostream> using namespace std; int main() {

巧解正则表达式环视

正则表达式匹配主要有两种,匹配字符和匹配位置.环视我个人理解应该更像是匹配位置的.具体下文说到.下面先看一下环视的正则表达式书写格式. 类型 正则表达式 匹配成功条件 肯定逆序环视 (?<=expresion) 子表达式能够匹配左侧文本 否定逆序环视 (?<!expresion) 子表达式不能匹配左侧文本 肯定顺序环视 (?=expresion) 子表达式能够匹配右侧文本 否定顺序环视 (?!expresion) 字表达式不能匹配右侧文本 本表摘自<精通正则表达式>p66 你要是觉

SQLite中使用CTE巧解多级分类的级联查询

在最近的活字格项目中使用ActiveReports报表设计器设计一个报表模板时,遇到一个多级分类的难题:需要将某个部门所有销售及下属部门的销售金额汇总,因为下属级别的层次不确定,所以靠拼接子查询的方式显然是不能满足要求,经过一番实验,利用了CTE(Common Table Expression)很轻松解决了这个问题! 举例:有如下的部门表 以及员工表 如果想查询所有西北区的员工(包含西北.西安.兰州),如下图所示: 如何用CTE的方式实现呢? Talk is cheap. Show me the

巧解Tomcat中JVM内存溢出问题

你对Tomcat 的JVM内存溢出问题的解决方法是否了解,这里和大家分享一下,相信本文介绍一定会让你有所收获. tomcat 的JVM内存溢出问题的解决 最近在熟悉一个开发了有几年的项目,需要把数据库从mysql移植到oracle,首先把jdbc的连接指向mysql,打包放到tomcat里面,可以跑起来,没有问题,可是当把jdbc连接指向oracle的时候,tomcat就连续抛java.lang.OutOfMemoryError的错误,上网google了一下,了解了一下tomcat的运行机制,也