算法-21可见的山峰对数量
描述
给出一个单链表,返回删除单链表的倒数第 K 个节点后的链表。
输入描述:
第一行输入两个正整数 n, K ,分别表示链表的长度和要删除单链表倒数第K个节点。 接下来一行有 n 个整数,依次表示单链表中的各个节点的节点值val。
输出描述:
在给定的函数内返回删除倒数第K个节点后的链表的头指针。
示例1
输入:
5 4 1 2 3 4 5
输出:
1 3 4 5
思路
1. 先从头到位遍历一遍遍历表,每遍历一个节点将K值减1, 将K值更新为K-N;
2. 如果k 值大于0,说明链表根本没有倒数第k 个节点 如果等于0,那么头节点就是倒数第k 个节点,此时应该返回 head.next;
3. 如果小于0,再遍历一遍链表,每遍历一个节点将K值加1,直到K值为0停止,这样就将K值更新为0-(K-N)= N-K,此时的节点便是第N-k个节点,即:要删除"倒数第k个节点"的前一个节点;
代码如下:
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int k = sc.nextInt(); if(n<k) { System.out.println("链表根本没有倒数第K个节点"); } Node node = new Node(sc.nextInt()); Node head = node; for(int i=1;i<n;i++) { Node next = new Node(sc.nextInt()); node.next = next; node = next; } Node result = removeLastKtheNode(head,k); StringBuilder sb = new StringBuilder(); while(result != null) { sb.append(result.value).append(" "); result = result.next; } System.out.println(sb.toString().trim()); } public static Node removeLastKtheNode(Node head,int lastKth) { if(head == null || lastKth<1) { return head; } Node cur = head; while(cur != null) { lastKth--; cur = cur.next; } if(lastKth == 0) { head = head.next; } if(lastKth<0) { cur = head; while(++lastKth != 0) { cur = cur.next; } cur.next = cur.next.next; } return head; } } class Node { public int value; public Node next; public Node(int data) { this.value = data; } }

浙公网安备 33010602011771号