LeetCode:Remove Nth Node From End of List 移除鏈表倒第n項

一、題目名稱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

相關文章
相關標籤/搜索