给定一个链表,删除链表的倒数第 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; } };