大杂烩 -- 查找单向链表倒数第m个元素
基础大杂烩 -- 目录
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
1.输入并查找
方案:头插法,正向查找第m个元素。
import java.util.Scanner;
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while (in.hasNext()) {
ListNode node = new ListNode();
node.next = null;
int N = in.nextInt();
for (int i = 0; i < N; i++) {
ListNode p = new ListNode();
int x = in.nextInt();
p.next = node.next;
p.data = x;
node.next = p;
}
int k = in.nextInt();
ListNode kthNode = getKthNode(node,k);
System.out.println(kthNode.data);
}
}
public static ListNode getKthNode(ListNode node,int k){
ListNode front = node,behind = node;
int x=0;
while(front.next!=null && x<=k){
x++;
front = front.next;
}
return front;
}
}
class ListNode {
public int data;
public ListNode next;
}
2.指定单向链表并查找倒数第m个元素
两种情况:无环、有环
无环方案:因为无环单向链表最后一个元素next一定为null,因此设置两个指针slow = head ,fast = head + m,当fast.next == null时slow.next恰好是倒数第m个元素。
有环方案:查找连接点,分割成无环单向链表,最后一个元素next一定为连接点join,将最后一个元素next --> null,此时用无环方案即可解决。因此设置连个指针slow = head ,fast = head + m,当fast.next == null时slow.next恰好是倒数第m个元素。
无环方案Class :
package limeMianShi.link; public class Test01 { public static void main(String[] args) {
ListNode head = new ListNode(0);
ListNode p = head;
for (int i = 1; i <= 10; i++) {
ListNode node = new ListNode(i);
p.next = node;
p = node; }
printListNode(head);
printKElement(head,3);
} private static void printKElement(ListNode head, int m) {
if(m == 0){
System.out.println("null");
}
ListNode p = head;
if(m > 0){
for(int i = 0;i < m;i++){
if(i == m - 1){
System.out.println("正数第" + m + "个元素为: " + p.data);
}
p = p.next;
}
}else{
ListNode s = head;
for(int i = 0;i < -m;i++){
p = p.next;
}
while(null != p){
s = s.next;
p = p.next;
}
System.out.println("倒数第" + (-m) + "个元素为: " + s.data);
}
} private static void printListNode(ListNode head) {
if (null != head) {
System.out.print(head.data + " --> ");
printListNode(head.next);
}else{
System.out.println("null");
}
}
} class ListNode { public int data;
public ListNode next; public ListNode() {
super();
} public ListNode(int data) {
this.data = data;
}
}
有环方案Class :
package limeMianShi.link; public class Test02 { public static void main(String[] args) {
ListNode head = new ListNode(0);
ListNode p = head;
ListNode p4 = null;
for (int i = 1; i <= 10; i++) {
ListNode node = new ListNode(i);
p.next = node;
p = node;
if (i == 4) {
p4 = node;
}
}
p.next = p4;
pullLoop(head);
printListNode(head);
for (int i = 1; i < 11; i++) {
printKElement(head, -i);
}
} private static void printListNode(ListNode head) {
if (null != head) {
System.out.print(head.data + " --> ");
printListNode(head.next);
} else {
System.out.println("null");
}
} private static void printKElement(ListNode head, int m) {
if (m == 0) {
System.out.println("null");
}
ListNode p = head;
if (m > 0) {
for (int i = 0; i < m; i++) {
if (i == m - 1) {
System.out.println("正数第" + m + "个元素为: " + p.data);
}
p = p.next;
}
} else {
ListNode s = head;
for (int i = 0; i < -m; i++) {
p = p.next;
}
while (null != p) {
s = s.next;
p = p.next;
}
System.out.println("倒数第" + (-m) + "个元素为: " + s.data);
}
} private static void pullLoop(ListNode head) {
ListNode p = getP(head);
ListNode pre = null;
while (head != p) {
pre = p;
head = head.next;
p = p.next;
}
pre.next = null;
} private static ListNode getP(ListNode head) {
ListNode solw = head.next;
ListNode fast = head.next.next;
while (solw != fast) {
solw = solw.next;
fast = fast.next.next;
}
return solw;
}
} class ListNode {
public int data;
public ListNode next; public ListNode() {
} public ListNode(int data) {
this.data = data;
}
}
啦啦啦
大杂烩 -- 查找单向链表倒数第m个元素的更多相关文章
- 笔试题&面试题:设计一个复杂度为n的算法找到单向链表倒数第m个元素
设计一个复杂度为n的算法找到单向链表倒数第m个元素.最后一个元素假定是倒数第0个. 提示:双指针查找 相对于双向链表来说,单向链表仅仅能从头到尾依次訪问链表的各个节点,所以假设要找链表的倒数第m个元素 ...
- 求链表倒数第n个元素
提示:设置一前一后两个指针,一个指针步长为1,另一个指针步长为n,当一个指针走到链表尾端时, 另一指针指向的元素即为链表倒数第n个元素. #include <stdio.h> #inclu ...
- 寻找链表倒数第k个元素,只遍历一遍(编程之美)
class LNode { public LNode next; public int data; } /*找出倒数第k个元素,只遍历一遍*/ class Kk { private static LN ...
- 【剑指offer】输出链表倒数第K个元素
/* public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } }*/ ...
- C#学习单向链表和接口 IList<T>
C#学习单向链表和接口 IList<T> 作者:乌龙哈里 时间:2015-11-04 平台:Window7 64bit,Visual Studio Community 2015 参考: M ...
- 输出单向链表中倒数第k个结点
描述 输入一个单向链表,输出该链表中倒数第k个结点,链表的倒数第0个结点为链表的尾指针. 链表结点定义如下: struct ListNode { int m_nKey; ListNode* ...
- 输入一个单向链表,输出该链表中倒数第K个结点
输入一个单向链表,输出该链表中倒数第K个结点,具体实现如下: #include <iostream> using namespace std; struct LinkNode { publ ...
- 【编程题目】输入一个单向链表,输出该链表中倒数第 k 个结点
第 13 题(链表):题目:输入一个单向链表,输出该链表中倒数第 k 个结点.链表的倒数第 0 个结点为链表的尾指针.链表结点定义如下: struct ListNode {int m_nKey;Lis ...
- 寻找单向链表的倒数第k个节点
题目: 输入一个单向链表,输出这个单向链表的倒数第k个节点 template<class T> class ListNode { public: T Data; ListNode<T ...
随机推荐
- WordPress主题开发:通过page的ID或者别名获取内容
访问地址:xx/?page_id=12 如果是在当前页面,只需要通过循环就可以输出对应的信息 <?php if(have_posts()):while(have_posts()):the_pos ...
- linux C++ 获取服务器外网IP地址(使用系统调用system)
废话不多说,直接贴代码: #include<string.h> #include<stdlib.h> #include<stdio.h> #include<s ...
- JavaScript 空间分析库——JSTS和Turf【转】
https://blog.csdn.net/neimeng0/article/details/80363468 前言 项目中有管线的空间拓扑关系查询需求,在npm中检索到JSTS和Turf两个Java ...
- Android Studio 3.1 正式版
欢迎大家推荐自己在Android开发过程中用的好用的工具.学习开发教程.用到设计素材.如果你觉得本站对你有用,你可以点击底部的分享按钮,把本站分享到社交网络让你的小伙伴和更多的人知道. 或者可以考虑捐 ...
- vim IDE配置
参考: http://www.cnblogs.com/witcxc/archive/2011/12/28/2304704.html http://www.cnblogs.com/ma6174/arch ...
- Extjs的grid的单元格中加载超链接和按钮
效果: 户型图列显示的图片实际上就是一个超链接. 添加一个Button分2个步骤:1.在列头中定义超链接列或者Button列的HTML代码,也就是Render 2.添加该Button的事件处理函数.其 ...
- python3用BeautifulSoup用字典的方法抓取a标签内的数据
# -*- coding:utf-8 -*- #python 2.7 #XiaoDeng #http://tieba.baidu.com/p/2460150866 #标签操作 from bs4 imp ...
- 关于redis性能问题分析和优化
一.如何查看Redis性能 info命令输出的数据可以分为10个分类,分别是: server,clients,memory,persistence,stats,replication,cpu,comm ...
- CART决策树(分类回归树)分析及应用建模
一.CART决策树模型概述(Classification And Regression Trees) 决策树是使用类似于一棵树的结构来表示类的划分,树的构建可以看成是变量(属性)选择的过程,内部节 ...
- Apache学习---多进程处理模块(MPM)原理详解
查看Apache的模式,可以使用httpd -V命令来查看: 1. prefork MPM prefork模式可以算是很古老但是非常稳定的Apache模式.Apache在启动之初,就预先fork一些子 ...