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?
给一个链表和一个数字,这个数字代表倒数第几个节点。将这个节点从链表移除。
由于是单向链表,所以我们只能从头捋到尾。我的想法很简单,先从头数到尾,看看一共多少节点,然后将倒数的节点转化成正数的节点。最后将这个节点移除。
/** * 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 n) { ListNode* LN = head; int count=1; int index; while(LN->next!=NULL){ count++; LN=LN->next; } index = count-n+1; LN = head; if(n==1&&count==1){//n==1和链表只有一个节点的情况 return NULL; } if(index==1){//要移除的是第一个节点的情况 head = head->next; return head; } while(index>2){//其他的正常情况下面的代码处理 LN=LN->next; index--; } LN->next = LN->next->next; return head; } };
讨论区还有更聪明的做法
class Solution { public: ListNode* removeNthFromEnd(ListNode* head, int n) { ListNode** t1 = &head, *t2 = head; for(int i = 1; i < n; ++i) { t2 = t2->next; } while(t2->next != NULL) { t1 = &((*t1)->next); t2 = t2->next; } *t1 = (*t1)->next; return head; } };好机智啊,我溜了。。。。。