博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
大杂烩 -- 查找单向链表倒数第m个元素
阅读量:6285 次
发布时间:2019-06-22

本文共 4954 字,大约阅读时间需要 16 分钟。

-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 

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;    }}

啦啦啦

转载地址:http://tsxva.baihongyu.com/

你可能感兴趣的文章
FrameWork中SQLServer数据源使用宏函数出错解决办法
查看>>
[.net 面向对象编程基础] (8) 基础中的基础——修饰符
查看>>
如何在plSql查询数据查出的数据可编辑
查看>>
2015年第11本:代码整洁之道Clean Code
查看>>
PHP 错误与异常 笔记与总结(11 )register_shutdown_function() 函数的使用
查看>>
talend 将hbase中数据导入到mysql中
查看>>
内置在虚拟机上64位操作系统:该主机支持 Intel VT-x,但 Intel VT-x 残
查看>>
Material Design练习
查看>>
[译] 二、开始iOS编程之前,你还需要做什么?
查看>>
Oracle 查看表空间的大小及使用情况sql语句
查看>>
加密解密帮助类(对称加密)
查看>>
分页和多条件查询功能
查看>>
ActiveReport开发入门-图表的交互性
查看>>
iOS开发之遍历Model类的属性并完善使用Runtime给Model类赋值
查看>>
Echarts图表控件使用总结2(Line,Bar)—问题篇
查看>>
【转载】CString、BSTR和LPCTSTR之间的区别
查看>>
淘宝开放源码WebserverTengine基本安装步骤
查看>>
thinkphp达到UploadFile.class.php图片上传功能
查看>>
如何在windows server 2008上配置NLB群集
查看>>
.NET 下各种Resource的读取方式
查看>>