题目描述
- 删除单链表倒数第k个节点,要求时间复杂度为n,空间复杂度为1。
解题方法1
- 最简单的方法,先将链表遍历一遍求出链表长度n,那么倒数第k个节点其实就是第n-k+1个节点。
- 然后再次遍历链表找到待删除的节点和删除节点前一个节点即可。
public class Test {
public static void main(String[] args) throws Exception {
int[] arr = {1,2,3,4,5,6,7,8,9,10,11,12};
Node head = create1(arr);
delnode(head,10);
for(Node p=head.next;p!=null;p=p.next){
System.out.print(p.val + " ");
}
}
public static void delnode(Node head,int k){
int len=0;
for(Node p=head.next;p!=null;p=p.next){
len++;
}
int num = len-k+1;
if(num>len || num<1){
return;
}
Node prenode = head;
for(int i=0;i<num-1;i++){
prenode = prenode.next;
}
prenode.next = prenode.next.next;
}
public static Node create1(int[] arr){
Node head = new Node(0);
Node newnode = null;
Node lastnode = head;
for(int a:arr){
newnode = new Node(a);
newnode.next = lastnode.next;
lastnode.next = newnode;
lastnode = newnode;
}
return head;
}
}
class Node{
int val;
Node next;
Node(int val){
this.val = val;
}
}