大杂烩 -- 查找单向链表倒数第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 ...
随机推荐
- Android HttpURLConnection.connect找不到源 HttpURLConnection连接失败 HttpURLConnection.connect IO异常 解决办法
Android HttpURLConnection.connect找不到源 HttpURLConnection连接失败 HttpURLConnection.connect IO异常 解决办法 以下代 ...
- JTAG 引脚自动识别 JTAG Finder, JTAG Pinout Tool, JTAG Pin Finder, JTAG pinout detector, JTAGULATOR, Easy-JTAG, JTAG Enumeration
JTAG Finder Figuring out the JTAG Pinouts on a Device is usually the most time-consuming and frustra ...
- ${pageContext.request.contextPath}无法解析
摘要 突然出现无法解析${pageContext.request.contextPath}的问题,在点击<a href="${pageContext.request.contextPa ...
- C# ConcurrentStack实现
我们通过C# Queue 和Stack的实现知道Stack是依靠数组实现的,那么ConcurrentStack的栈又是如何实现的了,然后它的线程安全又是怎么做到的了? 来看看其code吧 public ...
- Java 对字符串数据进行MD5/SHA1哈希散列运算
Java对字符串数据进行MD5/SHA1哈希散列运算 [java] view plain copy package cn.aibo.test; import java.security.Message ...
- linux网络设备—mdio总线
一.结构体 struct mii_bus { const char *name; //总线名 char id[MII_BUS_ID_SIZE]; //id void *priv; //私有数据 int ...
- python3用BeautifulSoup抓取图片地址
# -*- coding:utf-8 -*- #python 2.7 #XiaoDeng #http://tieba.baidu.com/p/2460150866 #抓取图片地址 from bs4 i ...
- 解决《UNIX环境高级编程》(APUE)示例代码的编译问题
转自 http://cunsheng.sinaapp.com/?p=360 APUE中示例很多, 把这些源码拿来跑跑调调对学习理解有着莫大的帮助, 随书网站就提供了源码下载, 不过我自己在Linux和 ...
- ubuntu安装odbc及(mysql驱动)
一.安装odbc apt-get install unixodbc 如果需要用到编译的头文件之类的 apt-get install unixodbc-dev 二.安装mysql驱动 apt-get i ...
- JS 引擎执行机制
JS JS 是单线程语音 JS 的 Event Loop 是 JS 的执行机制.类似于 Android Handler 消息分发机制 JS 单线程 技术的出现都跟现实世界里的应用场景密切相关 JS 单 ...