删除链表中的某个数,算法时间复杂度是O(n)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_37817685/article/details/83514721
import java.util.Scanner;

/**
 * 
 */
/**   
 * @author jueying:   
 * @version 创建时间:2018-10-29 下午04:05:03   
 * 类说明   
 */
/**
 * @author jueying
 *
 */
public class Test10 {

	/**
	 * @param args 
	 *用O(1)的时间复杂度删除链表的某个结点:
	 *
	 *这句话我开始理解有歧义,我认为是需要先找到这个需要删除的结点,再进行删除,那么时间复杂度就是O(N),但是网上的解答方式都是理解类似为删除第几个结点
	 *区别在于这个相当于已经知道需要删除的结点位置,我理解的那种是不知道位置的。
	 *常规来说这种如果是需要删除链表结点,就需要从头到尾进行遍历到需要删除的链表结点位置,然后才能做删除操作,实则不是,我们只需要来修改指针
	 */

		 int size=0;//栈大小
		 static Node headNode;
		 static Node runNode;
		 static int k;//需要删除结点的位置
		 static Node deleteNode;
		
	    int i=0;
		class Node{
			private Node next;//指针
			
			private int data;//数据域
			
		}
		
		//尾插法创建单链表  队列形式先进先出
		public void fun(Node node,int data){
			if(i<=1){
				Node newNode=new Node();//创建新的结点
				newNode.data=i;//设置数据域
				newNode.next=null;
				node.next=newNode;
				if(i+1==k){
					deleteNode=newNode;
				}
				fun(newNode,++i);
			}
		}
		
		//头插法创建单链表  栈形式先进后出
		public void afterInsert(Node node,int data){
			if(i<=10){
				Node newNode=new Node();//创建新的结点
				newNode.data=i;//设置数据域
				newNode.next=node.next;
				node.next=newNode;
				afterInsert(node,++i);
			}
			
		}
		
		public void deleteNode(){
			
			if(runNode.next.next!=null){
				if(deleteNode!=null&&deleteNode.next!=null){//需要删除的结点不是最后一个
					Node p=deleteNode;
					deleteNode.data=p.next.data;//注意这里不能是 deleteNode=p,只能通过引用去修改被引用对象的属性,直接赋值只是让这个引用变量指向了新的对象
					deleteNode.next=p.next.next;//注意这里不能是 deleteNode.next=p.next.next
				}else{
					//删除最后一个只能是循环到倒数第二个,然后改变倒数第二个的指针为null
					while(runNode!=null&&runNode.next.next!=null){//循环n-1次
						runNode=runNode.next;
					}
					runNode.next=null;
				}
				
			}else{
				
			}
			
			
		}
	 
		/**
		 * @param args
		 */
		public static void main(String[] args) {
			// TODO Auto-generated method stub
			   Test10 test=new Test10();
			   headNode=test.new Node();//头指针
			   System.out.println("请输入需要删除的链表结点位置");
			   Scanner sc=new Scanner(System.in);
			   k=sc.nextInt();
			   test.fun(headNode,0);//前插法
			   //new Test6().afterInsert(headNode,0);//后插法
			   runNode=headNode;
			   test.deleteNode();
	           System.out.println("删除后的链表是:");
	           while(headNode!=null&&headNode.next!=null){
	        	   headNode=headNode.next;
	        	   System.out.print(headNode.data+" ");
	           }
		}
	 
	}

猜你喜欢

转载自blog.csdn.net/weixin_37817685/article/details/83514721