有一段时间没有练习了,练习了两题,删除结点没有指出结点的位置,对链表的操作,可以总结一下。关于链表是否有头节点自己看题。。。
/***************************************************** * \file removeListNode.cpp * \date 2016/04/23 10:48 * \问题描述: 实现一个算法,删除单向链表中间的某个结点,假定你只能访问该结点。 给定带删除的节点,请执行删除操作,若该节点为尾节点,返回false,否则返回true * \问题分析: *****************************************************/ struct ListNode { int val; struct ListNode* next; ListNode(int x) :val(x), next(nullptr){} }; class Remove { public: bool removeNode(ListNode* pNode) { //pNode为删除节点 // write code here if (pNode==nullptr||pNode->next==nullptr) { return false; } ListNode* node = pNode->next;//node删除节点 pNode->next = node->next; return true; } }; /***************************************************** * \file removeListNode.cpp * \date 2016/04/23 11:01 * \问题描述: 编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前 给定一个链表的头指针 ListNode* pHead,请返回重新排列后的链表的头指针。注意:分割以后保持原来的数据顺序不变。 * \问题分析: 要是链表换作数组要特别小心,因为搬迁数组要涉及到移动元素的开销,而移动链表的元素则容易很多,我们不需要移动和交换链表中的元素, 只是改变一下每个节点的next指针就可以,我们可以创建两个链表,一个链表是存放小于x的元素,另一个链表存放大于等于x的元素, 然后遍历一遍原有链表,将小于x元素的节点加到第一个链表上,将大于等于x元素的节点加到第二个链表上。便可实现分割。 《程序员面试金典》题目详解:http://blog.csdn.net/zdplife/article/category/5799903 或者: 时间O(n), 空间O(1)的做法。 大致思路是从头到尾遍历一遍,若val大于x,则将该结点转移到List的尾部。 思路很简单,需要注意是如何在转移结点时找到它的父结点,防止List断掉。 *****************************************************/ class Partition { public: ListNode* partition(ListNode* pHead, int x) { // write code here ListNode *pSamllFirst = new ListNode(0); ListNode *pBigFirst = new ListNode(0); ListNode *pSamll = pSamllFirst, *pBig = pBigFirst; if (pHead==nullptr) { return pHead; } while (pHead) { if (pHead->val<x) { pSamll->next = pHead; pSamll = pSamll->next; } else { pBig->next = pHead; pBig = pBig->next; } pHead = pHead->next; } pBig->next = nullptr; pSamll->next = pBigFirst->next; return pSamllFirst->next; } }; #include <iostream> using namespace std; int main() { return 0; }