版权声明:本文为博主原创文章,未经博主允许不得转载。 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+" ");
}
}
}