題目:
給定一個鏈表,刪除鏈表的倒數第 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;
}
}
}