题目:
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
给定的 n 保证是有效的。
进阶:
你能尝试使用一趟扫描实现吗?
代码:
package leetCode;
import leetCode.TwoHundredsAndThirtySeven.ListNode;
/**
* 2018.7.23
* 删除聊表的倒数第n个结点
* @author dhc
*
*/
public class Nineteen {
public class ListNode {
int val;
ListNode next;
ListNode(int x){
this.val = x;
}
}
//一般情况下是先扫描一遍链表找出链表的长度,然后在扫描一遍找到删除结点并删除这个结点
//但是我们可以用一个变量来在第一遍扫描的时候来存储这个删除结点,当扫描的尾结点的时候,这个结点就找出来了,再删除就行
//有大佬同样的方法但是处理方式有点不同,是先通过n找到距离头结点为n的那个结点,然后循环
public static ListNode removeNthFromEnd(ListNode head, int n) {
if(head.next == null) {
return null;
}
if(n == 0) {
return head;
}
ListNode delNode = head;
//delPreNode用来处理删除的是尾结点
ListNode delPreNode = head;
ListNode loopNode = head;
int count = 0;
while(loopNode != null) {
if(count == n && delNode == head) {
delNode = delNode.next;
}else if(count == n && delNode != head){
delPreNode = delNode;
delNode = delNode.next;
}else {
count++;
}
loopNode = loopNode.next;
}
if(delNode.next != null) {
delNode.val = delNode.next.val;
delNode.next = delNode.next.next;
}else if(delNode.next == null){
delPreNode.next = null;
}else {
delNode.next = null;
}
return head;
}
public static void main(String[] args) {
ListNode head = new Nineteen().new ListNode(1);
ListNode node1 = new Nineteen().new ListNode(2);
ListNode node2 = new Nineteen().new ListNode(3);
ListNode node3 = new Nineteen().new ListNode(4);
ListNode node4 = new Nineteen().new ListNode(5);
head.next = node1;/*
node1.next = node2;
node2.next = node3;
node3.next = node4;*/
head = removeNthFromEnd(head, 1);
while(head!=null) {
if(head.next == null) {
System.out.print(head.val);
}else {
System.out.print(head.val+"->");
}
head = head.next;
}
}
}