算法-24在链表中删除第 K 个节点

描述

给定一个链表,实现删除链表第 K 个节点的函数。

输入描述:

n 表示链表的长度。

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());
    }
}

 

posted @ 2022-07-08 14:26  思凡念真  阅读(249)  评论(0编辑  收藏  举报