Given a linked list, remove the n-th node from the end of list and return its head.
Example:
Given linked list: 1->2->3->4->5, and n = 2. After removing the second node from the end, the linked list becomes 1->2->3->5.
Note:
Given n will always be valid.
Follow up:
Could you do this in one pass?
题意:删除链表的倒数第n个结点,并返回链表的头指针
思路一:将倒数第n个转换成正数第(链表长度-n+1)个
class Solution { public: ListNode* removeNthFromEnd(ListNode* head, int n) { //删除倒数第n个转化为,删除正数第几个 //要考虑比较多的特殊情况,head==NULL head->next==NULL //还有len-n==0的 int len1=len(head); if(head==NULL ||head->next==NULL) return NULL; ListNode *p; p=head; if(len1-n==0) head=head->next; else{ for(int i=1;i<len1-n;i++){ p=p->next; } p->next=p->next->next; } return head; } int len(ListNode *Head) { int count=0; while(Head!=NULL){ Head=Head->next; count++; } return count; } };
思路二:设置两个指针,一个先走n步,然后两个指针再一起走,等第一个指针到达链表最后一个结点,另一个指针指向结点的下一个结点,就是需要删除的倒数第n个结点
class Solution { public: ListNode* removeNthFromEnd(ListNode* head, int n) { ListNode *p1,*p2; p1=head; p2=head; if(head==NULL || head->next==NULL) return NULL; while(n--){ p1=p1->next; } if(p1==NULL) return head->next; //这种情况直接return,不要只是修改head,这样后面继续运行会出错 while(p1->next!=NULL){ p1=p1->next; p2=p2->next; } p2->next=p2->next->next; return head; } };