找出单链表的中间位置指针

需求

单链表不可以用下标直接得到中间位置,可以采取一前一后(前面的走2步,后面的走一步)的方式实现。

参考代码1


 struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};

ListNode* Partition(ListNode *beg)
{
if (beg == NULL || beg->next == NULL)
return beg;
ListNode *rev = beg;
ListNode *cur = beg->next;
while(cur->next != NULL && cur->next->next != NULL)
{
rev = rev->next;
cur = cur->next->next;
}
return rev->next;
}

 效果

如果想返回前一指针,可以改成这样

参考代码2


 struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};

ListNode* Partition(ListNode *beg)
{
if (beg == NULL || beg->next == NULL)
return beg;
ListNode *rev = beg;
ListNode *cur = beg->next;
while(cur->next != NULL && cur->next->next != NULL)
{
rev = rev->next;
cur = cur->next->next;
}
return rev->;
}

效果

时间: 2024-10-24 21:56:01

找出单链表的中间位置指针的相关文章

[算法]找出单链表中的倒数第k个元素

找出单链表中的倒数第k个元素 解题思路: 为了求出链表中的倒数第k个元素,最容易想到的方法是首先遍历一遍单链表,求出整个单链表的长度n,然后将倒数第k个,转换为正数第n-k个,接下去遍历一次就可以得到结果.不过这种方法需要对链表进行两次遍历,第一次遍历用于求解单链表的长度,第二次遍历用于查找正数第n-k个元素. 如果沿从头至尾的方向从链表中的某个元素开始,遍历k个元素刚好到达链表尾,那么元素就是要找的倒数第k个元素.设计如下:依次对链表的每一个结点元素进行这样的测试,遍历k个元素,查看是否到达链

如何找出单链表中的倒数第k个元素

(1)方法1:首先遍历一遍单链表,求出整个单链表的长度n,然后将倒数第k个,转换为正数第n-k个,接下去遍历一次就可以得到结果.但该算法需要对链表进行两次遍历,第一次遍历用于求解单链表的长度,第二次遍历用于查找正数第n-k个元素. (2)方法2:如果沿着从头到尾的方向,从链表中的某个元素开始,遍历k个元素后刚好达到链表尾,那么该元素就是要找的倒数第k个元素.根据这一性质,可以设计如下算法:从头节点开始,一次对链表的每一个节点元素进行这样的测试,遍历k个元素,查看是否到达链表尾,直到找到那个倒数第

【单链表】找出单链表中环的“入口”

题目: 找出单链表中环的"入口". 解答步骤: 1.用快慢指针判断是否存在环(慢指针走一步,快指针走两步).若存在环则继续下面的计算,若不存在则返回nullptr: 2.记录快慢指针相遇的节点n0. 3.一个指针从链表头结点出发,另一个指针从n0出发,"同步前进",相遇的节点就是环的"入口". 分析: 由于快慢指针所走的"步数"相同,但快指针每一步是慢指针的两倍,所以快慢指针在n0相遇时,快指针所走距离是慢指针的两倍,即: S

找出单链表的倒数第K个(从1开始计数)结点的值

1 typedef struct Link 2 { 3 int data; 4 struct Link* next; 5 }NODE,*pNODE; 1 NODE *searchK(NODE *phead, int k) 2 { 3 pNODE pcur = phead, ppre = phead; 4 int cnt = 0; 5 if(phead == NULL || k == 0) 6 return NULL; 7 8 while(pcur != NULL) 9 { 10 ++cnt; 1

[LeetCode] Linked List Cycle II 链表环起始位置

Given a linked list, return the node where the cycle begins. If there is no cycle, return null. Follow up:Can you solve it without using extra space? Hide Tags Linked List Two Pointers 开始犯二了一点,使用了node 的val 作为判断,其实是根据内存判断.找出链表环的起始位置,这个画一下慢慢找下规律便可以: 思路

链表中间节点位置

查找链表中间节点位置有多种方式,首先会想到先遍历一遍获知节点个数,然后取一半作计数器控制访问步数. 另一种常会用到的是设置两个指针:fast_p, slow_p,步长分别为2和1,这样根据物理中 路程公式 s = v * t; fast_p走过的路程是slow_p的两倍,fast_p走到链表尾部时,slow_p一定在中间或中间左边第一个节点. 切记,循环终止条件是(fast == null || fast.next == null) 不需要判断slow的状态. 如上图,序号分表代表第几次循环,同

链表中的头指针和头结点(转)

链表中的头指针和头结点 链式存储 指针域(单链表),来记录下一个结点的存储位置(地址) 插入和删除结点时,只需要修改指针即可 struct node{ int data; struct node *next; } data是数据域,用于存储数据 next是指针域,用于存储下一个结点的位置(地址) 原文地址:https://www.cnblogs.com/wwqdata/p/11578861.html

双循环链表(包含头指针与尾指针)

双循环链表(包含头指针与尾指针) 以及基本功能的实现 list_ d_link_c.h #ifndef _LIST_D_LINK_C_ #define _LIST_D_LINK_C_ #include<iostream> #include<assert.h> using namespace std; #define ElemType int typedef struct Node { ElemType data; struct Node *prio; struct Node *ne

找出链表的第一个公共节点

62.找出链表的第一个公共结点.题目:两个单向链表,找出它们的第一个公共结点 思路: 1.暴力法 但时间复杂度太高 o(n*m) 2.如果两个链表有公共节点,则从该公共节点起,后面的节点均为公共的,即这两个链表在第一个公共节点交叉,然后形成一个Y字型,因为两个链表长度不一定一样,所以可以先求得他们的长度n与m,然后得到长度差:Math.abs(n-m),然后先对较长链表先行遍历n-m个节点,从第n-m+1个节点开始对这两个链表遍历,然后找出第一个相同的即可  (网上抄别人的) 3. 位图法 对两