题目描述
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
给定的 n 保证是有效的。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* removeNthFromEnd(struct ListNode* head, int n) {
struct ListNode *p1,*p2;
int l = 0,dif; //l是链表中非空节点的个数 - 1;
int i;
p1 = p2 = head;
while(p1->next != NULL)
{
l++;
p1 = p1->next;
}
if (l == 0) //单节点链表的情况,输入n必为1,删除后是空链表
return NULL;
dif = l - n; //dif变量用来定位待删除节点的前一个节点
if(l+1 == n)//删除表头节点,
{
p2 = p2->next;
return p2;
}
for(i=0;i<dif;i++) //把指针已到待删除节点的前一个节点
{
p2 = p2->next;
}
p2->next = p2->next->next; //删除节点操作
return head;
}