链表中间节点位置

查找链表中间节点位置有多种方式,首先会想到先遍历一遍获知节点个数,然后取一半作计数器控制访问步数。

另一种常会用到的是设置两个指针:fast_p, slow_p,步长分别为2和1,这样根据物理中 路程公式

s = v * t;

fast_p走过的路程是slow_p的两倍,fast_p走到链表尾部时,slow_p一定在中间或中间左边第一个节点。

切记,循环终止条件是(fast == null || fast.next == null) 不需要判断slow的状态。

如上图,序号分表代表第几次循环,同一序号左端的是slow节点,右边的是fast

fast遇到终止条件的时候(fast == null or fast.next == null)

slow正好在n/2处。

运用,如果回文以链表存储时,如问题Palindrome Linked List

需要从slow.next的位置开始比较。

时间: 2024-10-18 15:29:00

链表中间节点位置的相关文章

C语言实现单链表的节点插入(带头结点)

我在之前一篇博客<C语言实现单链表(不带头结点)节点的插入>中具体实现了怎样在一个不带头结点的单链表中进行节点的插入.可是在实际应用中,带头结点的链表更为经常使用.更为方便.今天我们就要来使用带头结点的单链表进行节点的插入.演示样例代码上传至 https://github.com/chenyufeng1991/InsertList_HeadNode  . 核心代码例如以下: Node *InsertNode(Node *pNode,int pos,int x){ int i = 0; Node

链表倒数第k个结点、链表中间节点、链表是否有环

题目描述: 输入一个链表,输出该链表中倒数第k个结点. (hint: 请务必使用链表.) 输入: 输入可能包含多个测试样例,输入以EOF结束. 对于每个测试案例,输入的第一行为两个整数n和k(0<=n<=1000, 0<=k<=1000):n代表将要输入的链表元素的个数,k代表要查询倒数第几个的元素. 输入的第二行包括n个数t(1<=t<=1000000):代表链表中的元素. 输出: 对应每个测试案例, 若有结果,输出相应的查找结果.否则,输出NULL. 样例输入: 5

剑指Offer:删除链表的节点【18】

剑指Offer:删除链表的节点[18] 题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 题目分析 如上图所示,我们的定义了三个指针,其中第二.三个指针用于找到重复元素的第一个位置和最后一个位置的下一个位置,然后第一个指针的下一个指向三个指针,这样就跳过了重复元素. 但是编码发现后,还有两种情况欠考虑. 这种情况,刚开始,就是

环形链表入口节点

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

【链表】在O(1)的时间删除链表的节点

1 /** 2 * 在O(1)的时间删除链表的节点 3 * 4 * @author 5 * 6 */ 7 public class Solution { 8 9 public static void deleteNode(Node head, Node deletedNode) { 10 if (null == head || null == deletedNode) { 11 return; 12 } 13 14 if (deletedNode.next != null) { // 删除的不是

输入一个链表,从尾到头打印链表每个节点的值

题目描述: 输入一个链表,从尾到头打印链表每个节点的值. 输入描述: 输入为链表的表头 输出描述: 输出为需要打印的"新链表"的表头 用栈处理: /** *    public class ListNode { *        int val; *        ListNode next = null; * *        ListNode(int val) { *            this.val = val; *        } *    } * */ import 

单链表删除节点

单链表删除节点 node *del(node *head, int num) { node *p1, *p2; p1 = head; while (num != p1->data && p1->next != NULL) { p2 = p1; p1 = p1->next; } if (num == p1->data) { if (p1 == head) head = p1->next; else p2->next = p1->next; free(

cocos2d-x改底层之动态改变UIListView中的某项在链表中的位置

先看一下UIListView添加.插入.删除的机制,再来考虑如何移动某一项在链表中得位置. UIListView.h /* 所有项用一个数组来保存 */ CCArray* _items; void ListView::pushBackCustomItem(Widget* item) { /* 向数组中添加一项 */ _items->addObject(item); remedyLayoutParameter(item); addChild(item); _refreshViewDirty = t

链表(6)----查找链表中间节点

1.链表定义 typedef struct ListElement_t_ { void *data; struct ListElement_t_ *next; } ListElement_t; typedef struct List_t_{ int size; int capacity; ListElement_t *head; ListElement_t *tail; } List_t; 2.查找链表中间节点,设置快慢指针,快指针一次走两步,慢指针一次走一步 void *SearchMidNo