1、给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
给定的 n 保证是有效的。
2、难度提升:
使用一趟扫描实现。
import java.util.Scanner;
//一个简单的链表类
class Node {
public int data;
public Node next;
public Node(int e) {
this.data = e;
}
}
public class main06 {
public static void dayin(Node p) {
System.out.println("当前链表:");
while (p != null) {
System.out.print(p.data);
p = p.next;
if (p != null)
System.out.print("->");
}
System.out.println();
}
public static void test1() {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入:链表长度:(之后应题目要求,默认当做不知道链表长度)");
int m = scanner.nextInt();
//将链表头数值赋值为1
Node head = new Node(1);
Node p = head;
//将p当做指针,进行链表连接
for (int i = 2; i < m + 1; i++) {
p.next = new Node(i);
p = p.next;
}
//打印链表
dayin(head);
System.out.println("请输入要删除倒数第几个节点:");
int n = scanner.nextInt();
//进行循环,查看链表长度
int num = 0;
p = head;
while (p != null) {
num++;
p = p.next;
}
//根据查到的链表长度,和要删除的节点位置,进行删除
p = head;
if (num == n) {
head = head.next;
} else {
for (int i = 0; i < num - n - 1; i++) {
p = p.next;
}
p.next = p.next.next;
}
//打印链表
dayin(head);
}
public static void main(String[] args) {
System.out.println("基本方法:");
test1();
System.out.println();
System.out.println();
System.out.println();
System.out.println("一次扫描法:(快慢指针)");
test2();
}
private static void test2() {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入:链表长度:(之后应题目要求,默认当做不知道链表长度)");
int m = scanner.nextInt();
//将链表头数值赋值为1
Node head = new Node(1);
Node p = head;
//将p当做指针,进行链表连接
for (int i = 2; i < m + 1; i++) {
p.next = new Node(i);
p = p.next;
}
//打印链表
dayin(head);
System.out.println("请输入要删除倒数第几个节点:");
int n = scanner.nextInt();
//进行循环,查看链表长度
int num = 0;
p = head;
Node q = head;
for (int i = 0; i < n - 1; i++) {
p = p.next;
}
while (p.next != null) {
p = p.next;
if (p.next != null)
q = q.next;
}
if (q == head) {
head = head.next;
} else
q.next = q.next.next;
//打印链表
dayin(head);
}
}