【LeetCode】删除链表的倒数第N个节点【双指针法】

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

示例:

给定一个链表: 1->2->3->4->5, 和 n = 2.

当删除了倒数第二个节点后,链表变为 1->2->3->5.

说明:

给定的 n 保证是有效的。

进阶:

你能尝试使用一趟扫描实现吗?

来源:力扣(LeetCode)
链接:
https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list

分析:

双指针法:

两个指针k1和k2都指向头结点,k1先走n步,然后k1和k2一起走,当k1走到尾部的时候,k2指向的结点就是链表的倒数第n个结点

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int k)
{
    if(head==NULL)
        return NULL;
    if(head->next==NULL&&k==1)
        return NULL;
    ListNode *p1=head,*p2=head,*pre=head;
    int c=k-1;
    while(c--)
    {
        p2=p2->next;
    }
    while(p2->next!=NULL)
    {
        pre=p1;
        p1=p1->next;
        p2=p2->next;
    }
    if(p1==head)
        return p1->next;
    else
    {
        pre->next=p1->next;
    }
    return head;
}
};
posted @ 2019-08-12 19:42  西*风  阅读(225)  评论(0编辑  收藏  举报