关闭

剑指offer:链表的操作

225人阅读 评论(0) 收藏 举报
分类:

在链表中找到第一个含有某值的节点并删除该节点的代码:

void AddToTail(ListNode** pHead,int value)//pHead是一个指向指针的指针
{
	ListNode* pNew=new ListNode();
	pNew->m_nValue=value;
	pNew->m_pNext=NULL;
	if(*pHead==NULL)
	{
		*pHead=pNew;
	}
	else
	{
		ListNode* pNode=*pHead;
		while(pNode->m_pNext!=NULL)
			pNode=pNode->m_pNext;
		pNode->m_pNext=pNew;
	}
}
/*
在下面的链表中找到第一个含有某值的节点并删除该节点的代码
*/
void RemoveNode(ListNode** pHead,int value)
{
	if(pHead==NULL||*pHead==NULL)
		return;
	ListNode* pToBeDeleted=NULL;
	if((*pHead)->m_nValue==value)
	{
		pToBeDeleted=*pHead;
		*pHead=(*pHead)->m_pNext;
	}
	else
	{
		ListNode* pNode=* pHead;
		while(pNode->m_pNext != NULL
			&& pNode->m_pNext->m_nValue != value )
			pNode = pNode->m_pNext;

		if(pNode->m_pNext != NULL && pNode->m_pNext->m_nValue==value)
		{
			pToBeDeleted = pNode->m_pNext;
			pNode->m_pNext=pNode->m_pNext->m_pNext;
		}
	}
	if(pToBeDeleted != NULL)
	{
		delete pToBeDeleted;
		pToBeDeleted = NULL;
	}
}

/*
往链表的末尾中添加一个节点
*/
void AddToTail(List** pHead,int value)
{
	ListNode* pNew = new ListNode();
	pNew->m_nValue = value;
	pNew->m_pNext = NULL;

	if(*phead == NULL)
	{
		*pHead = pNew;
	}
	else
	{
		ListNode* pNode = *pHead;

		while(pNode->m_pNext != NULL)
			pNode = pNode->m_pNext;
		pNode->m_pNext = pNew;
	}
}
/**
*  struct ListNode {
*        int val;
*        struct ListNode *next;
*        ListNode(int x) :
*              val(x), next(NULL) {
*        }
*  };
*/
/*
一般就是想把链表中的链接结点的指针反转过来,改变链表的方向,然后就可以从头到尾输出了,但该方法会改变原来链表的结构
是否允许在打印链表的时候修改链表的结构?
如果不能改变链表的结构:
遍历的顺序是从头到尾的顺序,可输出的顺序却是从尾到头,因为就是说第一个遍历到节点的最后一个输出,
而最后一个遍历到的节点第一个输出。这就是典型的“后进先出”,这可以利用栈实现这种顺序。
每经过一个节点的时候,把该节点放到一个栈中。当遍历完整个链表后,再从栈顶开始逐个输出节点的值,
此时输出的节点的顺序已经反转过来了
*/
class Solution {
public:
    vector<int> printListFromTailToHead(struct ListNode* head) {
//这里是无返回值的情况
 /*        if(head != NULL)
           {
            if(head->next != NULL)
                {
                printListFromTailToHead(head->next);
            }
            printf("%d\t",head->val);
        }
    }
    return 1;*/
    vector<int> dev;
        if(head!=NULL)
        {
            if(head->next!=NULL)
            {
                dev=printListFromTailToHead(head->next);
            }
            dev.push_back(head->val);
        }
        return dev;
}
};
《剑指offer》P52




0
0
查看评论

剑指offer_面试题16_反转链表(两种方法)

题目:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。 在解决问题前,先想好测试用例: 1、功能测试:输入的链表含有多个结点,链表中只有一个结点 2、特殊输入测试:头结点为 NULL指针 解决这个问题有两种方式: 前提: 这两种方式 是以 头结点并不是第一个数...
  • jwentao01
  • jwentao01
  • 2015-08-10 11:00
  • 2031

《剑指offer》链表中环的入口结点

【 声明:版权所有,转载请标明出处,请勿用于商业用途。  联系信箱:libin493073668@sina.com】 题目链接:http://www.nowcoder.com/practice/253d2c59ec3e4bc68da16833f79a38e4?rp=3...
  • libin1105
  • libin1105
  • 2015-09-13 17:54
  • 914

《剑指Offer》面试题57:删除链表中重复的节点

题目:在一个排序的链表中,如何删除重复的节点? 样例输入: 1 2 3 3 4 4 5 样例输出: 1 2 51.新建一个头节点,以防第一个节点被删除。 2.保存当前节点上个节点,循环遍历整个链表,如果当前节点的值与下一个节点的值相等,则将当前节点的值与next.next节点的值比较,直到不相...
  • qq_24486393
  • qq_24486393
  • 2016-07-09 21:07
  • 874

剑指offer(58):链表中环的入口节点

题目描述一个链表中包含环,请找出该链表的环的入口结点。
  • u011080472
  • u011080472
  • 2016-04-30 15:23
  • 347

《剑指offer》——链表中环的入口结点

T: 题目描述 一个链表中包含环,请找出该链表的环的入口结点。 基本做法不考虑其中潜在的规律,就按照一般的方法,创建一个list,把扫描过的节点都存储在list中,知道下一个节点在list中已经存在,那就说明该节点就是入口节点。这种方式下的时间复杂度为O(n2)O(n^2)我的code...
  • shansusu
  • shansusu
  • 2015-12-13 20:02
  • 1096

剑指Offer面试题56:链表中环的入口节点 Java实现

题目:链表中环的入口节点         一个链表中包含环,如何找出环的入口节点?例如,下图中的入口节点是3.              1-&...
  • gg543012991
  • gg543012991
  • 2016-10-13 23:33
  • 314

剑指offer 16---单链表的逆置

单链表的逆置 非递归实现 #include #include using namespace std; struct ListNode{ int _value; ListNode* _next; ListNode(const int& value) :_value(value...
  • weixin_36125166
  • weixin_36125166
  • 2017-07-14 22:53
  • 460

【剑指offer】反转链表(递归+非递归)

题目: 输入一个链表,反转链表后,输出链表的所有元素。 分析: 反转链表只需改变链接方向,改变方向时需要将原本指向后一个结点的链接方向指向前一个结点,因此需要记录下三个结点。 实现: public ListNode ReverseList(ListNode head) { ListNod...
  • wangyongna926
  • wangyongna926
  • 2016-06-20 21:04
  • 895

剑指offer之面试题15-2:单链表是否有环

题目描述判断一个单链表是否形成了环形结构。思路:首先,有环的定义是,链表的尾节点指向了链接中间的某个节点。比如下图,如果单链表有环,则在遍历时,在通过6之后,会重新回到3,这道题和求链表的倒数第k个结点一样,采用的思想都是定义两个指针,使两指针在遍历时以某种方式错开,最后看两个指针是否相等。错开方式...
  • sushauai
  • sushauai
  • 2016-04-23 15:35
  • 481

剑指offer--面试题26:复杂链表的复制--Java实现

题目描述:复制一个复杂链表,在复杂链表中,每个结点除了有一个next指针指向下一个结点外,还有一个sbiling指向链表中的任意结点或者null。下图是一个复杂链表的示例,Null的指针没有画出。 解题思路:1.很直观的解法就是分成两步:1).复制原始链表上的每一个结点,并用next指针连起来。 ...
  • u012289407
  • u012289407
  • 2015-06-23 20:14
  • 1875
    个人资料
    • 访问:67411次
    • 积分:1103
    • 等级:
    • 排名:千里之外
    • 原创:41篇
    • 转载:22篇
    • 译文:1篇
    • 评论:17条
    最新评论