每日一题 为了工作 2020 03014 第十二题
/**
* 题目:在单链表中删除倒数第K个节点
* 实现函数可以删除单链表中的倒数第K个节点。
* 要求:
* 如果链表长度为N,时间复杂度为O(N),额外空间复杂度达到O(1)。
* 分析:
* 1.如果链表为空或者 K值小于1, 这种情况下, 参数是无效的, 直接返回即可。
* 除此之外, 让链表从头开始走到尾, 每移动一步, 就让 K的值减1。
*
* 链表: 1->2->3, K=4, 链表根本不存在倒数第4个节点
* 走到的节点: 1 -> 2 -> 3
* K变化为: 3 2 1
*
* 链表: 1->2->3, K= 3, 链表倒数第3个节点是l 节点。
* 走到的节点: 1 -> 2 -> 3
* K变化为: 2 I 0
*
* 链表: 1->2->3, K=2, 链表倒数第2个节点是2节点。
* 走到的节点: 1 -> 2 -> 3
* K变化为: 1 0 1
*
* 由以上三种情况可知, 让链表从头开始走到尾, 每移动一步, 就让 K值减 1, 当链表
*走到结尾时, 如果 K值大于0, 说明不用调整链表, 因为链表根本没有倒数第 K个节点,
*此时将原链表直接返回即可;
*
* 如果 K值等于0, 说明链表倒数第K个节点就是头节点, 此时直接返回head.next,
*也就是原链表的第二个节点,让第二个节点作为链表的头返回即可,相当于删除头节点;
*
* 如果K值小于0,首先明确一点, 如果要删除链表的头节点之后的某个节点, 实际上需要
*找到要删除节点的前一个节点, 比如: 1->2->3, 如果想删除节点2, 则需要找到节点1,
*然后把节点1连到节点3上(1->3), 以此来达到删除节点2的目的。
*
* 如果K值小于0, 如何找到要删除节点的前一个节点呢?方法如下:
*1. 重新从头节点开始走, 每移动一步, 就让 K的值加 1。
*2. 当 K等于 0时, 移动停止, 移动到的节点就是要删除节点的前一个节点。
*
* 如果链表长度为N, 要删除倒数第K个节点, 很明显,倒数第K个节点的前一个节点就是
*第 N-K个节点。在第一次遍历后, K的值变为 K-N。第二次遍历时,K的值不断加1,加到 0
*就停止遍历, 第二次遍历当然会停到第 N-K个节点的位置。
*
* @author 雪瞳
*
*/
public class Node {
public int value;
public Node next;
public Node(int data) {
this.value=data;
}
}
public class ReamoNode {
public Node removeLastKthNode(Node head , int K) {
if(K<0 || head == null) {
return null;
}
Node cur = head;
while(cur!=null) {
K = K-1;
cur = cur.next;
}
if(K==0) {
head = head.next;
}
if(K<0) {
cur = head;
while(++K != 0) {
cur = cur.next;
}
//将当前节点与下一个节点的下一节点相连接
cur.next = cur.next.next;
}
return head;
}
}
import java.util.Random;
import java.util.Scanner;
public class testRemoveNode {
public static void main(String[] args) {
testRemoveNode test = new testRemoveNode();
ReamoNode remove = new ReamoNode();
Random rand = new Random();
Node nodes[]=new Node[10];
Scanner sc = new Scanner(System.in);
System.out.print("请输入需要删除倒数第几个节点 K=");
int K = sc.nextInt();
for(int i=0;i<nodes.length;i++) {
nodes[i]=new Node(rand.nextInt(10));
}
for(int i =0;i<nodes.length-1;i++) {
nodes[i].next=nodes[i+1];
}
test.showNode(nodes[0]);
remove.removeLastKthNode(nodes[0], K);
test.showNode(nodes[0]);
}
public void showNode(Node head) {
System.out.println("链表内的元素如下所示...");
while(head != null) {
System.out.print(head.value+"\t");
head = head.next;
}
System.out.println();
}
}