链表_LeetCode_876_链表的中间节点

原题:给定一个带有头结点 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。

法一:遍历两次,第一次测出链表长度,第二次遍历至中间节点。

struct ListNode* middleNode(struct ListNode* head){
    int c=1;
    struct ListNode* p=head;
    struct ListNode* q=head;
    while(p->next){
        p=p->next;
        c++;
    }
    c=c/2;
    while(c){
        q=q->next;
        c--;
    }

    return q;
}

法二:遍历一次,将节点储存到数组中,一共有N个节点,则直接返回第N/2个节点。

法三:快慢指针

慢指针slow前进速度为1节点,快指针fast前进速度为2节点。则当fast到达链表末端时,slow到达链表中间节点。

该快慢指针模式将应用于今后若干场景,比较重要。

    struct ListNode* middleNode(struct ListNode* head) {
        struct ListNode* slow = head;
        struct ListNode* fast = head;
        while (fast != NULL && fast->next != NULL) {
            slow = slow->next;
            fast = fast->next->next;
        }
        return slow;
    }

 

posted @ 2020-03-26 12:56  Ruanzy  阅读(122)  评论(0)    收藏  举报