• 每日一题 为了工作 2020 0316 第十四题


    /**
    *
    *问题:删除链表的中间节点
    * 给定链表的头节点head, 实现删除链表的中间节点的函数。
    *
    *分析:
    * 不删除任何节点;
    * 1->2, 删除节点1;
    * 1->2->3, 删除节点2;
    * 1->2->3->4, 删除节点2:
    * 1->2->3->4->5, 删除节点3;
    *
    * 如果链表为空或者长度为1, 不需要调整, 则直接返回;
    * 如果链表的长度为2, 将头节点删除即可;
    * 当链表长度到达3, 应该删除第2个节点; 当链表长度为4, 应该删除第2个节点;
    * 当链表长度为5, 应该删除第3个节点……
    *
    *结论:
    * 也就是链表长度每增加2(3,5,7 ...), 要删除的节点就后移一个节点, 如果要删除一个节点, 则需要找到待删除节点的前一个节点。
    * @author 雪瞳
    *
    */

    public class Node<T> {
        public T value;
        public Node<T> next;
        public Node(T data){
            this.value = data;
        }
    }
    public class DeleteCenterNode {
    	
    		private Node pre;
    		private Node cur;
    	public Node deleteCenterNode(Node head) {
    		//链表为空或长度为 1 直接返回
    		if(head==null && head.next==null) {
    			return head;
    		}
    		//链表长度为2 删除头结点
    		if(head.next.next == null) {
    			head  = head.next;
    			return head;
    		}
    		//链表长度大于3
    		pre = head;
    		cur = head.next.next;
    		//从头结点开始遍历 就由于每长度每增加 2就会导致删除结点后移一个结点,所以只要遍历的尾部结点无法达到增加2的情况
    		//当前pre结点的下一结点就是需要删除的结点
    		while(cur.next !=null && cur.next.next !=null) {
    			pre = pre.next;
    			cur = cur.next.next;
    		}
    		//移除pre的下一个结点
    		pre.next = pre.next.next;
    		return head;
    		
    	}
    }
    

      

    import java.util.Random;
    import java.util.Scanner;
    
    public class testDeleteCenterNode {
        public static void main(String[] args) {
            DeleteCenterNode delete = new DeleteCenterNode();
            testDeleteCenterNode test = new testDeleteCenterNode();
            Random rand = new Random();    
            Scanner sc = new Scanner(System.in);
            System.out.println("请输入链表长度");
            int K = sc.nextInt();
            
            Node nodes[]=new Node[K];
            for(int i=0;i<nodes.length;i++) {
                nodes[i]=new Node(rand.nextInt(20)+1);
            }
            for(int i =0;i<nodes.length-1;i++) {
                nodes[i].next=nodes[i+1];
            }
            Node head = nodes[0];
            //test
            test.showNode(head);
            delete.deleteCenterNode(head);
            test.showNode(head);
            
        }
        public void showNode(Node head) {
            System.out.println("链表内的元素如下所示...");
            while(head != null) {
                System.out.print(head.value+"	");
                head = head.next;
            }
            System.out.println();
        }
    }

    /*运行结果

     

  • 相关阅读:
    【POJ】3243 Clever Y
    【BZOJ】3916: [Baltic2014]friends
    【URAL】1960. Palindromes and Super Abilities
    【BZOJ】3621: 我想那还真是令人高兴啊
    【BZOJ】2286: [Sdoi2011消耗战
    【POJ】2891 Strange Way to Express Integers
    鬼畜的多项式
    【CF】438E. The Child and Binary Tree
    【BZOJ】3456: 城市规划
    【POJ】1811 Prime Test
  • 原文地址:https://www.cnblogs.com/walxt/p/12503179.html
Copyright © 2020-2023  润新知