#include"stdio.h"
#include"stdlib.h"
#include"iostream"
using namespace std; struct ListNode
{
int m_Value;
ListNode* m_pNext;
}; ListNode* CreateListNode(int value)
{
ListNode* pNode=new ListNode();
pNode->m_Value=value;
pNode->m_pNext=nullptr; return pNode;
} void ConnectListNodes(ListNode* pCurrent,ListNode* pNext)
{
if(pCurrent==nullptr)
{
cout<<"Error to connect two nodes."<<endl;
exit();
}
pCurrent->m_pNext=pNext;
} void PrintListNode(ListNode* pNode)
{
if(pNode==nullptr)
{
cout<<"The node is nullptr."<<endl;
}
else
{
cout<<"the value in node is: "<<pNode->m_Value<<endl;
}
} void PrintList(ListNode *pHead)
{
cout<<"PrintList starts."<<endl; ListNode* pNode=pHead;
while(pNode!=nullptr)
{
cout<<pNode->m_Value<<" ";
pNode=pNode->m_pNext;
}
cout<<endl<<"PrintList ends."<<endl;
} void DestroyList(ListNode* pHead)
{
ListNode* pNode=pHead;
while(pNode!=nullptr)
{
pHead=pHead->m_pNext;
delete pNode;
pNode=pHead;
}
} void AddToTail(ListNode** pHead,int value)
{
ListNode* pNode=CreateListNode(value);
if(pHead==nullptr || *pHead==nullptr)
{
*pHead=pNode;
}
else
{
ListNode* pTemp=*pHead;
while(pTemp->m_pNext!=nullptr)
pTemp=pTemp->m_pNext;
pTemp->m_pNext=pNode;
}
} void RemoveNode(ListNode** pHead,int value)
{
if(pHead == nullptr || *pHead == nullptr)
return; ListNode* pToBeDeleted = nullptr;
if((*pHead)->m_Value == value)
{
pToBeDeleted = *pHead;
*pHead = (*pHead)->m_pNext;
}
else
{
ListNode* pNode = *pHead;
while(pNode->m_pNext != nullptr && pNode->m_pNext->m_Value != value)
pNode = pNode->m_pNext; if(pNode->m_pNext != nullptr && pNode->m_pNext->m_Value == value)
{
pToBeDeleted = pNode->m_pNext;
pNode->m_pNext = pNode->m_pNext->m_pNext;
}
} if(pToBeDeleted != nullptr)
{
delete pToBeDeleted;
pToBeDeleted = nullptr;//防止指正悬挂
}
}
//O(1)复杂度
void DeleteNode(ListNode** pHead,ListNode* pToBeDeleted)
{
if(*pHead==nullptr || pToBeDeleted==nullptr)
return;
if(pToBeDeleted->m_pNext!=nullptr)
{
ListNode* pNext=pToBeDeleted->m_pNext;
pToBeDeleted->m_pNext=pNext->m_pNext;
pToBeDeleted->m_Value=pNext->m_Value;
delete pNext;
pNext=nullptr;
}
else if(pToBeDeleted==*pHead)
{
delete pToBeDeleted;
pToBeDeleted=nullptr;
*pHead=nullptr;
}
else
{
ListNode* pNode=*pHead;
while(pNode->m_pNext!=pToBeDeleted)
pNode=pNode->m_pNext;
pNode->m_pNext=nullptr;
delete pToBeDeleted;
pToBeDeleted=nullptr;
}
} ListNode* TheLastKthNode(ListNode* pHead,int k)
{
if(pHead==nullptr || k<=)
return nullptr;
ListNode* quickNode=pHead;
ListNode* slowNode=pHead;
int cnt=;
while(quickNode->m_pNext!=nullptr&&cnt<k)
{
quickNode=quickNode->m_pNext;
++cnt;
}
if(cnt<k)
return nullptr;
while(quickNode->m_pNext!=nullptr)
{
quickNode=quickNode->m_pNext;
slowNode=slowNode->m_pNext;
}
return slowNode;
} ListNode* MeetingNode(ListNode* pHead)
{
if(pHead==nullptr)
return nullptr;
ListNode* quickNode=pHead;
ListNode* slowNode=pHead; while(quickNode->m_pNext!=nullptr&&quickNode->m_pNext->m_pNext!=nullptr)
{
quickNode=quickNode->m_pNext->m_pNext;
slowNode=slowNode->m_pNext;
if(quickNode==slowNode)
break;
}
if(quickNode!=slowNode)
{
return nullptr;
}
return slowNode;
} ListNode* EntryNodeOfLoop(ListNode* pHead)
{
ListNode* meetingNode=MeetingNode(pHead);
if(meetingNode==nullptr)
return nullptr;
int nodesInLoop=;
ListNode* pTemp=meetingNode;
while(pTemp->m_pNext!=meetingNode)
{
pTemp=pTemp->m_pNext;
nodesInLoop++;
}
ListNode* quickNode=pHead;
ListNode* slowNode=pHead;
for(int i=;i<nodesInLoop;i++)
quickNode=quickNode->m_pNext;
while(slowNode!=quickNode)
{
quickNode=quickNode->m_pNext;
slowNode=slowNode->m_pNext;
}
return slowNode;
}

剑指offer——链表的更多相关文章

  1. 剑指Offer 链表中倒数第k个结点

    题目描述 输入一个链表,输出该链表中倒数第k个结点.     思路: 法1:设置2个指针p,q.p先移动k次,然后pq同时后移,p到链表尾尾的时候,q指向倒数第k个节点. 注意://需要考虑k=0,以 ...

  2. 剑指offer——链表中倒数第k个结点

    输入一个链表,输出该链表中倒数第k个结点. class Solution { public: ListNode* FindKthToTail(ListNode* pListHead, unsigned ...

  3. 剑指Offer——链表中环的入口结点

    题目描述: 一个链表中包含环,请找出该链表的环的入口结点. 分析: 设置两个指针p1,p2, 两个指针都从链表的头部开始走,不过p1每次走一步,p2每次走两步. 直到相遇的时候,p2走的长度是p1的两 ...

  4. 剑指Offer——链表中倒数第k个节点

    Question 输入一个链表,输出该链表中倒数第k个结点. Solution 一种想法就是扫描两边,第一遍求出总的节点个数,第二遍从头开始走n-k个 第二种思想类似于fast-slow指针的方法,f ...

  5. 剑指offer——链表相关问题总结

    首先统一链表的数据结构为: struct ListNode { int val; struct ListNode *next; ListNode(int x) :val(x), next(NULL) ...

  6. python剑指offer 链表中环的入口节点

    题目: 一个链表中包含环,请找出该链表的环的入口结点. 思路: 先说个定理:两个指针一个fast.一个slow同时从一个链表的头部出发, fast一次走2步,slow一次走一步,如果该链表有环,两个指 ...

  7. 用js刷剑指offer(链表中倒数第k个结点)

    题目描述 输入一个链表,输出该链表中倒数第k个结点. 牛客网链接 思路 设置两个指针,p,q,先让p走k-1步,然后再一起走,直到p为最后一个 时,q即为倒数第k个节点 js代码 // 空间复杂度1 ...

  8. 剑指offer 链表中环的入口位置

    题目描述 一个链表中包含环,请找出该链表的环的入口结点.   思路:这题需要知道a = c,然后head和slow每次走一步,相遇的时候就是第一个入口交点, 注意:for循环或者while循环之后,一 ...

  9. 剑指offer 链表中倒数第K个节点

    利用两个间隔为k的指针来实现倒数第k个 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 ...

随机推荐

  1. Mysql加载本地CSV文件

    Mysql加载本地CSV文件 1.系统环境 系统版本:Win10 64位 Mysql版本: 8.0.15 MySQL Community Server - GPL Mysql Workbench版本: ...

  2. Charles 4.2.5 破解原理.RP

    请支持正版,仅供技术交流. 写了个小工具方便在线处理,在线破解 https://github.com/8enet/Charles-Crack 2018/4/8 Charles 4.2.5 替换类名和方 ...

  3. 3.1.7 线程阻塞工具类:LockSupport

    package 第三章.线程阻塞工具LockSupport; import java.util.concurrent.locks.LockSupport; /** * Created by zzq o ...

  4. javascript总结25:Array的5中迭代方法: every(), filter() , forEach() map() some()

    1 Array常用的操作方法: 1 操作方法 - concat() //把参数拼接到当前数组 -slice() //从当前数组中截取一个新的数组,不影响原来的数组,参数start从0开始,end从1开 ...

  5. Eclipse下配置主题颜色

    插件地址  http://eclipse-color-theme.github.com/update 安装之后 下载安装好之后,点击window -> preferences -> Gen ...

  6. 51nod 1421 最大MOD值(高妙的调和级数复杂度)

    有一个a数组,里面有n个整数.现在要从中找到两个数字(可以是同一个) ai,aj ,使得 ai mod aj 最大并且 ai ≥ aj. Input 单组测试数据. 第一行包含一个整数n,表示数组a的 ...

  7. C++ 调用C++写的类库的2种方法之一(隐式链接)

    一:创建C++ DLL类库,名称:Dll1 1.Dll1.h /*#ifndef Dll_API #else #define Dll_API _declspec(dllimport) #endif * ...

  8. java策略模式(及与工厂模式的区别)

    按一般教程中出现的例子理解: 简单工厂模式:客户端传一个条件进工厂类,工厂类根据条件创建相应的产品类对象,并return给客户端,供客户端使用.即客户端使用的是工厂类生产的产品对象. 策略模式:客户端 ...

  9. [LeetCode 题解]: Interger to Roman

    前言   [LeetCode 题解]系列传送门:  http://www.cnblogs.com/double-win/category/573499.html   1.题目描述 Given an i ...

  10. C#多线程学习(四) 多线程的自动管理(线程池)

    在多线程的程序中,经常会出现两种情况: 一种情况:   应用程序中,线程把大部分的时间花费在等待状态,等待某个事件发生,然后才能给予响应                   这一般使用ThreadPo ...