一、題目名稱java
Remove Nth Node From End of List(移除鏈表中倒數第n項)node
二、題目地址code
https://leetcode.com/problems/remove-nth-node-from-end-of-list/leetcode
三、題目內容開發
英文:Given a linked list, remove the nth node from the end of list and return its head.rem
中文:給出一個鏈表,刪去鏈表中的倒數第n項,返回鏈表首節點get
例如:it
給出鏈表:1->2->3->4->5,給出 n = 2,返回的鏈表爲:1->2->3->5io
四、解題方法1class
刪去鏈表的倒數第n項,有兩種辦法,一是將鏈表翻轉,把正數第n項刪去,再將鏈表翻轉回去。
Java代碼以下:
/** * 功能說明:LeetCode 19 - Remove Nth Node From End * 開發人員:Tsybius2014 * 開發時間:2015年8月6日 */ public class Solution { /** * 刪除鏈表中倒數第N項(從1開始計數) * @param head 鏈表首節點 * @param n 正整數 * @return 刪除後鏈表首節點 */ public ListNode removeNthFromEnd(ListNode head, int n) { if (head == null || n <= 0) { return head; } head = reverseList(head); head = removeNthFromBegin(head, n); head = reverseList(head); return head; } /** * 刪除鏈表中倒數第N項(從1開始計數) * @param head 鏈表首節點 * @param n 正整數 * @return 刪除後鏈表首節點 */ private ListNode removeNthFromBegin(ListNode head, int n) { if (head == null || n <= 0) { return head; } System.out.println("REMOVE NTH LIST NODE: " + n); if (n == 1) { return head.next; } ListNode nodeI = head; ListNode nodeJ = head.next; n--; while (--n != 0) { nodeI = nodeI.next; nodeJ = nodeJ.next; if (nodeJ == null) { return head; } } nodeI.next = nodeJ.next; return head; } /** * 翻轉鏈表 * @param head 翻轉前鏈表首節點 * @return 翻轉後鏈表首節點 */ private ListNode reverseList(ListNode head) { if (head == null || head.next == null) { return head; } System.out.println("REVERSE LIST"); ListNode nodeReverseHead = null; ListNode nodeTemp; ListNode nodeI = head; while (nodeI != null) { nodeTemp = new ListNode(nodeI.val); nodeTemp.next = nodeReverseHead; nodeReverseHead = nodeTemp; nodeI = nodeI.next; } return nodeReverseHead; } }
六、解題方法2
比解題方法1更簡單的方法是,先遍歷一次鏈表獲取鏈表長度len,第二次遍歷時遍歷到第len-n項時就能夠進行跳過。
Java代碼以下:
/** * 功能說明:LeetCode 19 - Remove Nth Node From End * 開發人員:Tsybius2014 * 開發時間:2015年8月6日 */ public class Solution { /** * 刪除鏈表中倒數第N項(從1開始計數) * @param head 鏈表首節點 * @param n 正整數 * @return 刪除後鏈表首節點 */ public ListNode removeNthFromEnd(ListNode head, int n) { if (head == null || n <= 0) { return head; } //獲取鏈表總長度 int len = 0; ListNode nodeTemp = head; while (nodeTemp != null) { nodeTemp = nodeTemp.next; len++; } //刪去倒數第N個點 if (len < n) { return head; } else if (len == n) { return head.next; } else { int counter = len - n; nodeTemp = head; while (--counter != 0) { nodeTemp = nodeTemp.next; } nodeTemp.next = nodeTemp.next.next; } return head; } }
END