题目:

 

删除链表中倒数第n个节点

给定一个链表,删除链表中倒数第n个节点,返回链表的头节点。

 样例

给出链表1->2->3->4->5->null和 n = 2.

删除倒数第二个节点之后,这个链表将变成1->2->3->5->null.

注意 链表中的节点个数大于等于n

解题:

要删除倒数第n个节点,我们要找到其前面一个节点,也就是倒数第n+1的节点,找到这个节点就可以进行删除。和上题的思想很类似,

定义两个指针,p和cur,cur指针向前走,走了n+1步后,p指针开始走,当cur走到结束时候的,p指向倒数n+1的节点

程序中注释部分要注意,当删除的是第一个节点时候,找不到其前一个节点,通过n==1的时候做判断

这里要注意在只有一个节点,也让你删除这个节点,好像只有单独考虑的,题目的节点数大于等于n,没有考虑节点数小于n的情况

Java程序:

/**
 * Definition for ListNode.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int val) {
 *         this.val = val;
 *         this.next = null;
 *     }
 * }
 */ 
public class Solution {
    /**
     * @param head: The first node of linked list.
     * @param n: An integer.
     * @return: The head of linked list.
     */
    ListNode removeNthFromEnd(ListNode head, int n) {
        // write your code here
        ListNode p = new ListNode(0);
        p.next = head;
        ListNode cur = new ListNode(0);
        cur.next = head;
        cur = cur.next;
        if(n==1 && head.next==null)
            return null;
        while(cur!=null){
            if(n>0){
                cur = cur.next;
                n--;
            }else if(n==0){
                cur = cur.next;
                head = head.next;
            
            }
            if(cur.next==null){// cur运行到最后一个节点
                if(n==1)//说明head指针没有移动,结合cur可知道,删除的是第一个节点,
                    return p.next.next; 
                if(head.next.next==null)
                    head.next = null;//删除的是最后一个节点
                else
                    head.next = head.next.next;//删除的是中间部分的节点
                break;
            }
                
            
        }
        return p.next;
    }
}
View Code

相关文章: