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

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

1、题目介绍

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

试题链接:https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list/

2、java

2.1、遍历两次

    public static ListNode removeNthFromEnd(ListNode head, int n) {
        if(head == null || head.next == null) return null;
        //求链表长度
        ListNode p = head;
        int size = 0;
        while (p != null)  {
            size++;
            p = p.next;
        }

        if(n == size) return head.next;

        p = head;
        for(int i = 2;i <= size - n;i++ ) {
            p = p.next;
        }

        p.next = p.next.next;

        return head;
    }

测试结果:

2.1、遍历一次

    public static ListNode removeNthFromEnd(ListNode head, int n) {
        if(head == null || head.next == null) return null;
        //求链表长度
        ListNode p = head;
        int flag = 0;
        while (p != null && p.next != null) {
            ListNode temp = p.next;
            for(int i = 0;i < n;i++) {
                if(temp == null) {
                    flag = 1;
                    break;
                }
                temp = temp.next;
            }
            if(flag == 1) {
                return head.next;
            }
            if(temp != null) {
                p = p.next;
            }else {
                p.next = p.next.next;
                return head;
            }
        }
        return head;
    }

测试结果:

3、C语言

3.1、遍历两次

struct ListNode* removeNthFromEnd(struct ListNode* head, int n){
    if(head == NULL || head->next == NULL) return NULL;
    //求链表长度
    struct ListNode* p = head;
    int size = 0;
    while (p != NULL)  {
        size++;
        p = p->next;
    }

    if(n == size) return head->next;

    p = head;
    for(int i = 2;i <= size - n;i++ ) {
        p = p->next;
    }

    p->next = p->next->next;

    return head;
}

测试结果:

3.1、遍历一次

struct ListNode* removeNthFromEnd(struct ListNode* head, int n){
    if(head == NULL || head->next == NULL) return NULL;
    //求链表长度
    struct ListNode* p = head;
    int flag = 0;
    while (p != NULL && p->next != NULL) {
        struct ListNode* temp = p->next;
        for(int i = 0;i < n;i++) {
            if(temp == NULL) {
                flag = 1;
                break;
            }
            temp = temp->next;
        }
        if(flag == 1) {
            return head->next;
        }
        if(temp != NULL) {
            p = p->next;
        }else {
            p->next = p->next->next;
            return head;
        }
    }
    return head;
}

测试结果:

posted @ 2020-03-02 21:25  孤傲的咸鱼  阅读(418)  评论(0编辑  收藏  举报