求链表的中心节点


#include<iostream>
using namespace std;

class node{
public:
node():value(0),next(NULL){}
~node(){}
int value;
node* next;
};///be careful this ;

node* createlist(int a[],int n)
{
node* startnode = new node[n];
node* ret = startnode;
for(int i = 0;i<n;i++)
{
startnode[i].value = a[i];
if(i<n-1)
startnode[i].next = startnode + i + 1;
}
while(startnode)
{
cout<<" "<<startnode->value;
startnode = startnode->next;
}
cout<<endl;
return ret;
}

void helper(node* head)
{
node* temp = head;
while(head->next != NULL && head->next->next != NULL)
{
head = head->next->next;
temp = temp->next;
}
cout<<temp->value; ///如果是奇数个,就是中间,如果是偶数个,指向第一个
}

int main()
{
int a[] = {1,2,3,4,5,6,7,8,9};
node * t = createlist(a,8);
helper(t);

}

求链表的中心节点

时间: 2024-10-11 23:08:24

求链表的中心节点的相关文章

求链表的第一个公共节点问题(好未来笔试题)

问题描述:给定两个链表的头指针,判断两个链表是否存在公共节点,如果存在公共节点,则找出第一个公共节点. 分析:这曾经是我参加好未来的一道笔试题目,给大家分享下解法. 解法一:蛮力法.拿第一个链表的每个节点去和第二个链表的每个节点进行比较,如果都不相同,则判断出两个链表不相交. 否则输出第一个相同的节点.算法的时间复杂度为O(m*n). 解法二:辅助空间法.仔细观察可以发现,如果两个链表想要相交,则尾节点必是相交点,否则不相交. 因此我们可以从两个链表的尾部开始进行比较,如果不相同,直接判断出不相

求单链表的中间节点,用快慢指针

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 Node* findMid(Node* &head) {     if(head == NULL||head->next == NULL)         return head;          Node* p = head;     Node* q = head;     while(q->next->next&&(q = q->next))     {         p = p-

求链表倒数第几个节点

使用两个指针,和判断一个链表是否形成环类似 代码: #include <iostream> #include <list> using namespace std; typedef struct node { int data; struct node *next ; }Node,*pNode; void creatNode( pNode &pHead ){ bool isFirst=true; pNode p,q; int temp; scanf("%d&quo

求链表的倒数第N个节点

最近看一本书上有求链表的倒数第N个节点,简单实现了下 链表,实现方案如下 1.不借助链表长度顺序遍历倒数第N个节点 GetReserveN就是如此实现. 2.当然如果链表记录了节点长度也可以直接正序遍历出来 第lenth-N个节点就是倒数节点. template<class T> class LinkedList { public: operator T(){return m_data;} virtual ~LinkedList() { if(m_size!=0) Clear(); } voi

求链表的倒数第k个节点

问题描述:给定一个链表的头节点,求出链表的倒数第k个节点. 分析:这是链表里的经典问题,存在多种解法,下面给大家分享下我的想法. 解法一:很直观的一种做法是从头到尾扫描链表,然后求倒数第k个,但是由于单链表无法从尾部向头部扫描, 因此可以借助其他的辅助空间去存储扫描过的所有节点,例如,数组或栈均可. 解法二:计算出链表中节点的总数为n,根据k 将其转化为正数的第n-k+1个节点,然后在从链表头开始走n-k+1个节点,就是所求. 解法三:可以设置两个指针实现,假设两个指针分别为p1和p2,p1从链

求链表的第一个公共节点

求链表的第一个公共节点主要思想 有如下两个链表: 有以下两种方法 上述链表,有一种蛮力方法,就是从一个链表中每一个节点,与另外链表中的节点,去比较, 如果从中找到相同的节点,表示有公共节点,这个算法时间复杂度为O(n*m),两个链表的长度分别为n,m 如果使用快慢指针,让链表长的指针,先走,走的步数就为,两者长度差,如果两者有相同节点,必然会在一个地方,相遇, 该算法的时间复杂度为O(max(n,m)) 方法2 的实现代码为: /* struct ListNode { int val; stru

单链表判断公共节点

单链表判断有无公共节点是个比较有趣的问题.这里所说的公共节点指的是完全相同的节点,不同与一般意义上的节点元素相同.相交单链表简单的都会是如下形式(有环除外): 粗略分析,容易想到就是暴力法,双重循环寻找公共节点. 关于单链表的判断有无公共节点,除了暴力法之外,还有很多方法可以尝试.下面简单列举几种. 可以尝试hash,如果两个节点的首地址相同,则该节点必定相同,可以以空间换取时间,先处理其中一个单链表,建立hash表,然后处理另外一个判断有无公共节点,时间复杂度为O(max(n,m)),空间复杂

C/C++,数据结构实现两个链表的合并(尾插法建立单链表,求链表长度,直接插入排序)

1题目 实现两个链表的合并 2基本功能要求: 1.建立两个链表A和B,链表元素个数分别为m和n个. 2.假设元素分别为(x1,x2,-xm),和(y1,y2, -yn).把它们合并成一个线性表C,使得: 当m>=n时,C=x1,y1,x2,y2,-xn,yn,-,xm 当n>m时,C=y1,x1,y2,x2,-ym,xm,-,yn 3.输出线性表C: 用直接插入排序法对C进行升序排序,生成链表D,并输出链表D. 3测试数据: (1)A表(30,41,15,12,56,80) B表(23,56,

求树中两个节点的最低公共祖先

情形1:树是搜索二叉树 思路:从树的根节点开始遍历,如果根节点的值大于其中一个节点,小于另外一个节点,则根节点就是最低公共祖先.否则如果根节点的值小于两个节点的值,则递归求根节点的右子树,如果大于两个节点的值则递归求根的左子树.如果根节点正好是其中的一个节点,那么说明这两个节点在一条路径上,所以最低公共祖先则是根节点的父节点 public static BinaryTreeNode getLowestCommonAncestor(BinaryTreeNode rootParent,BinaryT