算法-24在链表中删除第 K 个节点
描述
给定一个链表,实现删除链表第 K 个节点的函数。
输入描述:
n 表示链表的长度。
m 表示删除链表第几个节点。
val 表示链表节点的值。
m 表示删除链表第几个节点。
val 表示链表节点的值。
输出描述:
在给定的函数中返回链表的头指针。
示例1
输入: 5 3 1 2 3 4 5 输出: 1 2 4 5
思路
删除链表中的节点,本质都是找到其前一个节点。
(1)找到节点i-1的存储位置p,因为在单链表中节点ai的存储地址是在其直接前趋节点i-1的指针域next中;
(2)令p->next指向i的直接后继节点i+1;
(3)释放节点i的空间;
注意:
(1)设单链表的长度为n,则单链表删除第i个节点时,必须保证 1<= i <= n,否则不合法;
(2)当 i=n+1 时,虽然被删除节点不存在,但其前趋节点却存在,它是终端节点;所以,被删节点的直接前趋*p存在,并不意味着被删节点就一定存在,仅当*p存在(即p != NULL)且*p不是终端节点(即p->next != NULL)同时满足 j <= i时,才能确定被删节点存在。此时,算法的时间复杂度是O(n)。
代码如下:
import java.util.Scanner; import java.io.IOException; class Node { int value; Node next; public Node(int data){ this.value = data; } } public class Main{ public static Node removeK(Node node,int k){ if(node == null || k<=0) { return node; } Node cur = node; if(1 == k) { cur = cur.next; } if(k >1) { while(null != node.next && --k!=1) { node = node.next; } node.next = node.next.next; } return cur; } public static void main(String[] args) throws IOException { Scanner sc = new Scanner(System.in); String[]rawInput = sc.nextLine().trim().split(" "); int n = Integer.parseInt(rawInput[0]); int m = Integer.parseInt(rawInput[1]); if(m > n) { System.out.print(""); sc.close(); return; } String[] rawInputs = sc.nextLine().trim().split(" "); Node head = null; Node curNode = head; for(int i=0;i<rawInputs.length;i++) { Node next = new Node(Integer.parseInt(rawInputs[i])); if(head == null) { head = next; }else { curNode.next = next; } curNode = next; } StringBuilder sb = new StringBuilder(); Node result = removeK(head,m); while(result != null) { sb.append(result.value).append(" "); result = result.next; } System.out.println(sb.toString().trim()); } }