美文网首页
链表中查找/删除第K个元素

链表中查找/删除第K个元素

作者: pw007992 | 来源:发表于2016-12-11 11:35 被阅读0次

这类题的常见思路是设置两个指针,开始都指向头结点,第一个指针走K步后第二个指针再开始走,因为两个指针中间隔着K步,所以,当第一个指针指向最后一个NULL时,第二个指针刚好指向链表倒数第K个元素。除了思路是关键点外,这类题的鲁棒性是面试官考察的重点,具体是:1.输入的n比整个链表还长;2.n=0;3.链表为空。这三点要处理好。

一.在链表中查找倒数第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* head1 = pListHead;
        if(pListHead == NULL)
            return NULL;
        int i;
        for(i = 0; i <  k && head1 != NULL; i ++){
            head1 = head1 -> next;
        }

        if(head1 == NULL && i < k)//不存在倒数第k个元素
            return NULL;
        if(head1 == NULL && i == k)//第一个元素是第k个元素
           return pListHead;


        ListNode* temp = pListHead;
        while(head1){
            head1 = head1 -> next;
            temp = temp -> next;
        }
       
       return temp;
    }
};

二.在链表中删除倒数第K个元素

删除与查找倒数第K个元素的区别是查找需要定位到正好第K个元素,而删除需要定位到第K个元素的前一个元素。因此,对于查找,两个指针要相隔K个元素,而对于删除,两个元素要相隔k+1个元素.

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        ListNode* head1 = head;
        int i;
        for(i = 0; i <=  n && head1 != NULL; i ++){
            head1 = head1 -> next;
        }
       
        if(head1 == NULL && i < n)//不存在倒数第n个元素
            return head;
        if(head1 == NULL && i == n)//第一个元素是第n个元素
           return head -> next;
        
       
        ListNode* temp = head;
        while(head1){
            head1 = head1 -> next;
            temp = temp -> next;
        }
       temp -> next = temp -> next -> next;
       return head;
    }
};

相关文章

  • 链表中查找/删除第K个元素

    这类题的常见思路是设置两个指针,开始都指向头结点,第一个指针走K步后第二个指针再开始走,因为两个指针中间隔着K步,...

  • 单向链表算法

    单向链表 反转单向链表 单链表查找倒数第k个节点 单链表递归倒序打印 单链表排序 单链表删除重复节点

  • 面试算法题

    排序:选择排序,冒泡排序,快排,堆排,希尔排序 反转链表 删除链表的倒数第N个节点 数组中第K个最大元素 翻转数字...

  • 2.单链表

    该部分包含以下内容-单链表的增删改查-计算链表长度-逆序链表-寻找(删除)链表倒数第K个元素-逆序打印链表(使用栈)

  • 1.5 如何找出单链表中倒数第k个元素

    题目 找出单链表中倒数第k个元素,例如给定1>2>3>4>5>6>7,则单链表中的倒数第k=3个元素为5.

  • 在单链表和双链表中删除倒数第k个节点

    【题目】分别实现两个函数,一个可以删除单链表中倒数第k个节点,另一个可以删除双链表中倒数第k个节点。【解析】先来分...

  • 2018-07-26

    合并有顺序的数组 打印两个有序链表的公共部分 在单链表和双链表中删除倒数第k个节点 单链表 双链表 删除链表的中间...

  • 链表处理

    1.创建链表 2.查找元素 3.插入元素 4.删除元素 5.静态链表 1074 Reversing Linked ...

  • 链表中倒数最后k个结点

    描述 输入一个长度为 n 的链表,设链表中的元素的值为 ai ,返回该链表中倒数第k个节点。 如果该链表长度小于k...

  • 链表

    链表 缺点:查找复杂有点:定点删除/插入元素 单链表 双向链表 循环链表 双向循环链表 数组与链表的区别 数据存储...

网友评论

      本文标题:链表中查找/删除第K个元素

      本文链接:https://www.haomeiwen.com/subject/xtqpmttx.html