• 程序员面试经典--链表


    1题目描述

    输入一个链表,输出该链表中倒数第k个结点。
    /*
    struct ListNode {
        int val;
        struct ListNode *next;
        ListNode(int x) :
                val(x), next(NULL) {
        }
    };*/
    class Solution {
    public:
        ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
        
            ListNode*head = pListHead;
            ListNode*nodeK=pListHead;
            int len=0;//链表总长
            int index=0;//
            
            if(k<=0){
                return NULL;
            }
            while(head!=NULL){
                  len++;
                head=head->next;
            }
            if(k>len){
                return NULL;
            }
            index = len-k;
            
            while(index--){
                nodeK = nodeK->next;
            }
            return nodeK;
            
     
        }
    };
    View Code

    2题目描述

    实现一个算法,删除单向链表中间的某个结点,假定你只能访问该结点。

    给定带删除的节点,请执行删除操作,若该节点为尾节点,返回false,否则返回true

    /*
    struct ListNode {
        int val;
        struct ListNode *next;
        ListNode(int x) : val(x), next(NULL) {}
    };*/
    class Remove {
    public:
        bool removeNode(ListNode* pNode) {
            // write code here
            if(pNode->next == NULL){
                delete pNode;
                return false;
            }else{
                ListNode* nextNode;
                nextNode = pNode->next;
                pNode->val = nextNode->val;
                pNode->next = nextNode->next;
                delete nextNode;
                return true;
            }
        }
    };
    View Code

    3题目描述

    编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前

    给定一个链表的头指针 ListNode* pHead,请返回重新排列后的链表的头指针。注意:分割以后保持原来的数据顺序不变。

    class Partition {
    public:
        ListNode* partition(ListNode* pHead, int x) {
            // write code here
            ListNode* small=new ListNode(0);
            ListNode* large=new ListNode(0);
            ListNode* smallHead=small;
            ListNode* largeHead=large;
            while(pHead){
                if(pHead->val<x){
                    small->next=pHead;
                    small=small->next;
                }
                else{         
                    large->next=pHead;
                    large=large->next;
                }
                 
                pHead=pHead->next;
                     
            }
            large->next=NULL;
     
           small->next=largeHead->next;
           return smallHead->next;
             
        }
    };
    View Code

    4题目描述

    有两个用链表表示的整数,每个结点包含一个数位。这些数位是反向存放的,也就是个位排在链表的首部。编写函数对这两个整数求和,并用链表形式返回结果。

    给定两个链表ListNode* A,ListNode* B,请返回A+B的结果(ListNode*)。

    测试样例:
    {1,2,3},{3,2,1}
    返回:{4,4,4}
    /*
    struct ListNode {
        int val;
        struct ListNode *next;
        ListNode(int x) : val(x), next(NULL) {}
    };*/
    class Plus {
        
        int getNum(ListNode* a){
            
            int num=0;
            while(a){
                num += a->val;
                a=a->next;
                num=num*10;
            }
            return num/10;
        }
        
        ListNode * reverseNode(ListNode* a){
            ListNode* head = a;
            ListNode* pre ,*front,*p;
    
            if (a == NULL){
                return NULL;
            }
            front = a->next;
            pre = a;
    
            while (front){
                p = front->next;
                front->next = pre;
                pre = front;
                front = p;
            }
    
            head->next = NULL;
            return pre;
        }
        
    public:
        ListNode* plusAB(ListNode* a, ListNode* b) {
            // write code here
    
          int numA =   getNum(reverseNode(a));
          int numB =   getNum(reverseNode(b)); 
          int numC = numA+numB;
            int tmp;
          ListNode *head = new ListNode(-1); 
             ListNode *p =  head;
           while(numC){
              tmp = numC%10;
               numC /=10;
               p->next = new ListNode(tmp);
               p = p->next;
           } 
    
            return head->next; 
            
            
        }
    };
    View Code

    5题目描述

    请编写一个函数,检查链表是否为回文。

    给定一个链表ListNode* pHead,请返回一个bool,代表链表是否为回文。

    测试样例:
    {1,2,3,2,1}
    返回:true
    {1,2,3,2,3}
    返回:false
    /*
    struct ListNode {
        int val;
        struct ListNode *next;
        ListNode(int x) : val(x), next(NULL) {}
    };*/
    class Palindrome {
    public:
        bool isPalindrome(ListNode* pHead) {
            
            vector<int>a;
            ListNode* tmp = pHead;
            while(tmp){
                a.push_back(tmp->val);
                tmp = tmp->next;
            }
            int len = a.size();
            for(int i=0;i<len/2; i++){
                if(a[i] != a[len-i-1])
                    return false;
            }
            return true;
            // write code here
        }
    };
    View Code
  • 相关阅读:
    Oracle性能优化--DBMS_PROFILER
    Oracle性能优化--AUTOTRACE 操作
    浅谈SQL中的单引号
    pgadmin(IDE)工具连接postgres数据库
    Linux下的PostgreSQL简单安装手册
    es6常用方法总结
    vue下axios和fetch跨域请求
    作用域和作用域链
    ES5函数新增的方法(call、apply、bind)
    js递归和数组去重(简单便捷的用法)
  • 原文地址:https://www.cnblogs.com/yuguangyuan/p/6124401.html
Copyright © 2020-2023  润新知