zoukankan      html  css  js  c++  java
  • 大杂烩 -- 查找单向链表倒数第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;
        }
    }

    啦啦啦

  • 相关阅读:
    恭介的法则
    229. Majority Element II
    169. Majority Element
    233. Number of Digit One
    172. Factorial Trailing Zeroes
    852. Peak Index in a Mountain Array
    162. Find Peak Element
    34. Find First and Last Position of Element in Sorted Array
    81. Search in Rotated Sorted Array II
    33. Search in Rotated Sorted Array
  • 原文地址:https://www.cnblogs.com/ClassNotFoundException/p/7031180.html
Copyright © 2011-2022 走看看