关闭

剑指offer:链表的操作

132人阅读 评论(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

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:53833次
    • 积分:994
    • 等级:
    • 排名:千里之外
    • 原创:41篇
    • 转载:22篇
    • 译文:1篇
    • 评论:17条
    最新评论