利用快慢指针快速得到链表中间节点

//利用快慢指针快速得到链表中间节点
int getMiddleNodeValue(LIST * l) {
    NODE * search, * middle;

    search = l->head;
    middle = l->head;

    while (NULL != search->next) {
        if (NULL != search->next->next) {
            search = search->next -> next;
            middle = middle->next;
        }
        else{
            search = search->next;
        }
    }

    return middle->i;

}
时间: 2024-11-05 18:46:58

利用快慢指针快速得到链表中间节点的相关文章

【转】Linus:利用二级指针删除单向链表

原文作者:陈皓 原文链接:http://coolshell.cn/articles/8990.html 感谢网友full_of_bull投递此文(注:此文最初发表在这个这里,我对原文后半段修改了许多,并加入了插图) Linus大婶在slashdot上回答一些编程爱好者的提问,其中一个人问他什么样的代码是他所喜好的,大婶表述了自己一些观点之后,举了一个指针的例子,解释了什么才是core low-level coding. 下面是Linus的教学原文及翻译—— “At the opposite en

reorder-list——链表、快慢指针、逆转链表、链表合并

Given a singly linked list L: L0→L1→-→Ln-1→Ln,reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→- You must do this in-place without altering the nodes' values. For example,Given{1,2,3,4}, reorder it to{1,4,2,3}. 由于链表尾端不干净,导致fast->next!=NULL&&fast->next-&

c 链表之 快慢指针 查找循环节点

参考:http://blog.csdn.net/wenqian1991/article/details/17452715 上面分析了 根据这张图 推倒出 数学公式. 刚接触 不能一下弄明白.下面结合上面文章的分析.仔细推倒一下 , 一般设置 快指针 速度是 慢指针的2倍.及 快指针每次遍历两个指针, 慢指针每次遍历1个指针. 假设上图 快慢指针 在E点相遇,那 相遇点离循环节点D 之间距离是X.  头结点A 离循环节点D 距离为K. 那么在两指针相遇时,各自走过得距离(这里可以吧上图想成是 一个

单链表-快慢指针

快慢指针: 定义两个指针,一个快,一个慢,可以有多种用途.例如:快速找到位置长度单链表中的中间结点:对于循环链表中利用快慢指针也可以判断是否存在环. 快速找到位置长度单链表中的中间结点 1)使用一个指针,先索引一遍获取总长度,再取长度一半去循环获取到中间值:O(3L/2). 2)使用两个指针,快指针和慢指针,快指针一次向前走2格,慢指针一次走一格,当快指针走完全程,慢指针正好走在中间:O(L/2). 代码实现: //快速查找中间元素 int FindMidEle(LinkList L, Elem

LeetCode OJ 143. Reorder List(两种方法,快慢指针,堆栈)

Given a singly linked list L: L0→L1→-→Ln-1→Ln,reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→- You must do this in-place without altering the nodes' values. For example,Given {1,2,3,4}, reorder it to {1,4,2,3}. Subscribe to see which companies asked this quest

快慢指针的应用

1.判断单链表是否存在环 1 * Definition for singly-linked list. 2 * public class ListNode { 3 * public int val; 4 * public ListNode next; 5 * public ListNode(int x) { 6 * val = x; 7 * next = null; 8 * } 9 * } 10 */ 11 public class Solution { 12 public bool HasCy

环形链表入口节点

环形链表入口节点 题目描述 思路分析:判断是否有环 本题是判断环形链表是否有环的进阶题目. 环形链表题目利用了双指针技巧,设置快慢两个指针,每次快指针走两步慢指针走一步.假如链表有环,那么快慢指针在环的部分终究会相遇. 判断链表是否有环,比较简单直接上代码. public boolean hasCycle(ListNode head) { if (head == null || head.next == null) { return false; } ListNode slow = head;

Faster\Slower 快慢指针的应用

leetcode很多题目都是利用快慢指针来解决题目,下面具体讲解下快慢指针. 概念: 快指针在每一步走的步长要比慢指针一步走的步长要多.快指针通常的步速是慢指针的2倍.在循环中的指针移动通常为:faster = faster.next.next, slower = slower.next. 应用: 1. 用来找中点或中位数 2. 用来判断链表是否有环以及寻找环入口 3. 题目中含有:倒数第n个,那么设置快指针步长为n,然后快慢指针同时以同一速度走,用慢指针寻找倒数第n个 注意: 1. 通常需要特

快慢指针原理--快速找到未知长度单链表的中间节点

package com.java.dataStruct; //节点类 public class Node<E> { E item; Node next; public Node(){ } public Node(E element){ this.item = element; } public Node(E element, Node next){ this.item = element; this.next = next; } } Node p1,r1; Node L1 = new Node