leetcode 19. 删除链表的倒数第N个节点

给定一个链表,删除链表的倒数第 个节点,并且返回链表的头结点。

示例:

给定一个链表: 1->2->3->4->5, 和 n = 2.

当删除了倒数第二个节点后,链表变为 1->2->3->5.

说明:

给定的 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 n) {
        ListNode* p = head;//定义两个头结点的复制,一个用来遍历链表,计算整个链表的长度
        ListNode* q = head;//另一个用来删除指定位置处的节点
        int i = 0;
        while(p){//用i来保存链表的长度
            p=p->next;
            ++i;
        }
        if(i==n) return head->next;//当要删除头结点时
        n = i-n;
        i=0;
        while(q){
            ++i;
            if(i==n){
                q->next=q->next->next;
                break;
            }
            q=q->next;
        }
        return head;
    }
};

解法二:只需要一趟扫描

/**
 * 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 *p, *ans;
        p = head;
        ans = head;
        for (int i = 0; i < n; ++i) {
            p = p -> next;
        }
        if (p == NULL) return head -> next;
        while (p -> next != NULL) {
            ans = ans -> next;
            p = p -> next;
        }
        ans -> next = ans -> next -> next;
        
        return head;
    }
};

猜你喜欢

转载自blog.csdn.net/u011750466/article/details/80275255