美文网首页
链表—删除链表的倒数第N个节点

链表—删除链表的倒数第N个节点

作者: 尼小摩 | 来源:发表于2018-06-28 10:52 被阅读14次

解题思路:

  1. p2先走了n步,这样p2和p1之间差n个节点。
  2. p2和p1一起往后移动,当p2移动到了null的时候,p1移动到了倒数第n+1个节点的位置。
  3. 改变p1->next将他指向他的下一个节点的下一个节点,这样就是把倒数第n个节点给删掉了。

时间复杂度:O(N)

代码实现:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    /**
     * 使用两个工作指针p1,p2
     * p1指向头结点,p2指向顺数第n+1个节点
     * p1,p2同时后移,当p2移动到末尾时,p1指向倒数第n+1个节点
     * 单链表:删除倒数第n个节点,则需指针记录倒数第n+1个节点
     */
    public ListNode removeNthFromEnd(ListNode head, int n) {
        ListNode p1, p2;
        p1 = p2 = head;
        
        // p2移动到第n+1的位置
        for (int i = 0; i < n; i++) {
            p2 = p2.next;
        }
        // 判断p2是否移动到链表末尾,即n等于链表的长度。
        if (p2 == null) {
            head = head.next;
            return head;
        }
        
        // p1,p2同时后移
        while (null != p2.next) {
            p1 = p1.next;
            p2 = p2.next;
        }
        
        p1.next = p1.next.next;
        return head;
    }
}

相关文章

网友评论

      本文标题:链表—删除链表的倒数第N个节点

      本文链接:https://www.haomeiwen.com/subject/zkqgyftx.html