zoukankan      html  css  js  c++  java
  • 删除链表结点和链表分成两部分

          有一段时间没有练习了,练习了两题,删除结点没有指出结点的位置,对链表的操作,可以总结一下。关于链表是否有头节点自己看题。。。

    /*****************************************************
    * 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;
    }
  • 相关阅读:
    Java vs Python
    Compiled Language vs Scripting Language
    445. Add Two Numbers II
    213. House Robber II
    198. House Robber
    276. Paint Fence
    77. Combinations
    54. Spiral Matrix
    82. Remove Duplicates from Sorted List II
    80. Remove Duplicates from Sorted Array II
  • 原文地址:https://www.cnblogs.com/ranjiewen/p/5428007.html
Copyright © 2011-2022 走看看