链表操作---找到链表的中点

在很多链表的算法中,常常需要找到链表的中点。

这里给出一种使用双指针,一次遍历链表就能找到链表中点的方法。

使用一个快指针,每次走两步,一个慢指针,每次走一步。等快指针走到链表底部的时候,慢指针正好走到中点。

/**
* Definition for singly-linked list.
* struct ListNode {
*     int val;
*     ListNode *next;
*     ListNode(int x) : val(x), next(NULL) {}
* };
*/

ListNode * getmid(ListNode *head)
{
   if(!head||!head->next || !head->next->next)
      return head ;// 空节点,一个节点或者两个节点

   ListNode *mid = head ;
   ListNode * fast = head ;

   while(NULL!= fast->next && NULL!=fast->next->next)
    {
     mid = mid->next;
     fast = fast->next->next;
   }

    return mid;

}

input:1 2 3 4 5 6 7 8 9
output:5 6 7 8 9
时间: 2024-10-12 14:01:58

链表操作---找到链表的中点的相关文章

再谈单向链表操作——单向链表的访问与修改

链表的访问 既然理解了链表的构成,对链表的访问也就不成问题了.不过要特别注意的是,对于数组,我们可以利用下标直接访问任何一个元素(这被称为"随机访问"),而对于单向链表,只能从头结点开始,依次进行"顺序访问". 假设我们已经按照前文创建了一个链表,下面我们设计一个函数,查找是否存在某数据: //参数说明:p为头指针,n为所查找的数据 void search_node(l* p, int n) { //若非尾结点,则继续循环 while(p->next != N

10、单链表操作

单链表操作 单链表操作1 /*单链表的类型定义*/ typedef int DataType; typedef struct node { DataType data; struct node * next; }LinkNode, *LinkList; /*单链表的定位运算*/ LinkNode *Locate(LinkNode *L, int k)//????为什么此处是LinkNode *Locate()类型,表示什么意思 { LinkNode *p; int i; i= 1; p = L-

[链表常用技巧]链表逆序+链表中点

链表逆序 给定一个链表,一般的逆序的方法要设置三个指针,这种操作很繁琐,下面总结一种简单的方法: 为链表设置一个头结点,然后head后面的节点依次的插入到head结点之前.最后完成链表的逆序. 代码实现: ListNode* reverseList(ListNode* head) { if(head == NULL) return NULL; ListNode dummy(-1); dummy.next = head; ListNode *pre = dummy.next; while(pre-

链表操作的几个高效技巧

针对leetcode上面的20多个链表的算法题,总结了一下链表操作中的几个技巧. 1. 快慢指针 快慢指针是在遍历链表的时候使用两个指针,快指针每次比慢指针多跑一步或多步,或者快指针先跑n步.这在查找倒数第n个结点.找中间结点时只需要遍历一次,在判断链表是否有环时不需要额外的空间.例如,查找一个链表中间结点, ListNode * findMid(ListNode * head) { assert(head && head->next); ListNode *slow = head;

链表操作法则之逆向遍历与倒置算法

一.创建链表: 对链表进行操作的所有算法的前提,就是我们首先要创建一个链表,我们可以选择正向建链和逆向建链: (一).正向建链: 首先,我们得自定义节点类型: typedef struct Node { int data;//数据域 struct Node * pNext;//指针域 }NODE,*PNODE; 通过数组进行链表数据域的赋值: int main (void) { PNODE pHead;//头指针,接收创建链表时返回的头结点地址 int a[8] = {12,37,49,65,2

JAVA 链表操作:循环链表

主要分析示例: 一.单链表循环链表 二.双链表循环链表 其中单链表节点和双链表节点类和接口ICommOperate<T>与上篇一致,这里不在赘述.参考:JAVA链表操作:单链表和双链表http://www.cnblogs.com/xiaoxing/p/5969133.html 一.单链表循环链表 package LinkListTest; import java.util.HashMap; import java.util.Map; public class SingleCycleLinkLi

双链表操作(转)

双链表的初始化,建立,插入,查找,删除. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 8

JAVA 链表操作:单连表和双链表

主要讲述几点: 一.链表的简介 二.链表实现原理和必要性 三.单链表示例 四.双链表示例 一.链表的简介 链表是一种比较常用的数据结构,链表虽然保存比较复杂,但是在查询时候比较便捷,在多种计算机语言都相应的应用,链表有多种类别,文章针对单链表和双链表进行分析.链表中数据就像被一个链条串联一起,轻易的可以实现数据的访问. 二.链表实现原理和必要性 这里只分析单链表和双链表.链表的实现过程是有些许复杂的,但是会带来许多好处.比如现在网购时代到来,商家发快递一般会将商品包装在盒子里并写上地址信息,快递

单链表操作实例程序

#include <iostream> #include <iomanip> using namespace std; typedef struct node { int val; node *next; }node; node * create_list(); void traverse_list(node *pHead); int get_len_list(node *pHead); bool delete_list(node *pHead,int pos,int &v