删除链表的倒数第n个结点

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;
    }
};

猜你喜欢

转载自www.cnblogs.com/Bipolard/p/9988870.html