【算法面试3---链表】教程文章相关的互联网学习教程文章

C语言常见单链表面试题(1)【代码】

1、删除单链表的非尾节点解题思路:按照一般的思路单链表删除节点是必须知道其前驱节点才能删除,而在本题中不知道前驱节点,所以转换思路,先将需要删除的节点跟其后继节点的数据域交换,然后再删除既可。void EraseNotTail(pLinkNode pos) { assert(pos);pLinkNode del = NULL;//删除的节点del = pos->next;pos->data = pos->next->data;pos->next = pos->next->next;free(del);del = NULL; }2、冒泡排序单链表void BubbleSo...

LeetCode 面试题06. 从尾到头打印链表【代码】

题目链接:https://leetcode-cn.com/problems/cong-wei-dao-tou-da-yin-lian-biao-lcof/输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。示例 1:输入:head = [1,3,2]输出:[2,3,1] 限制:0 <= 链表长度 <= 10000 1/**2 * Definition for singly-linked list.3 * struct ListNode {4 * int val;5 * struct ListNode *next;6 * };7*/ 8 9/** 10 * Note: The returned array must be malloced, assum...

算法面试3---链表【代码】【图】

1 链表反转例1:LeetCode 206。本题虽然简单但却是众多公司的面试问题。反转前后的图示如下: 在反转的过程中主要是依据指针之间的移动,如下图所示:class Solution {public ListNode reverseList(ListNode head) {ListNode prev = null;while (head != null) {//1 每次修改前先把head.next备份否则head修改后找不到head.nextListNode nextTemp = head.next; //2 修改head.next temp用来保存的是上次头节点的信息head.next = prev...

面试-反转链表【代码】

面试-反转链表InterviewWorkJobC++面试题目经典算法题目 : 反转单链表 reverse list对于一个普通的单链表,可以定义成结构体形式:// 定义链表节点structListNode {int val;ListNode * next; }请写一个函数实现单链表的翻转题目解析一般来说,单链表的反转有递归和非递归的方式来进行实现, 此处的反转实现 参考反转链表图示 其中递归方式的实现比较难以理解, 进攻参考递归方式// 递归方式ListNode * ReverseList_re(ListNode * head){...

【LeetCode-面试算法经典-Java实现】【024-Swap Nodes in Pairs(成对交换单链表的结点)】【代码】【图】

【024-Swap Nodes in Pairs(成对交换单链表的结点)】【LeetCode-面试算法经典-Java实现】【所有题目目录索引】原题  Given a linked list, swap every two adjacent nodes and return its head. For example, Given 1->2->3->4, you should return the list as 2->1->4->3. Your algorithm should use only constant space. You may not modify the values in the list, only nodes itself can be changed. 题目大意  给定一...

面试题18(一):在O(1)时间删除链表结点【代码】

// 面试题18(一):在O(1)时间删除链表结点// 题目:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该// 结点。链表结点与函数的定义如下:// struct ListNode{// int m_nValue;// ListNode* m_pNext;// };// void deleteNode(ListNode** pListHead,ListNode* pToBeDeleted);解题思路:这是目前为止,唯一一道,我不看书就知道怎么做的题。正常从头遍历的话,很明显时间复杂度是O(n),但是他把目标结点给出来了...

【LeetCode-面试算法经典-Java实现】【114-Flatten Binary Tree to Linked List(二叉树转单链表)】【代码】【图】

【114-Flatten Binary Tree to Linked List(二叉树转单链表)】【LeetCode-面试算法经典-Java实现】【所有题目目录索引】原题  Given a binary tree, flatten it to a linked list in-place. For example, Given 1/ 2 5/ \ 3 4 6  The flattened tree should look like: 1 2 3 4 5 6题目大意  给定一棵二叉树,将它转成单链表,使用原地算法。 解题思...

面试题之剑指offer 二叉树转换成双向链表【图】

二叉树转换成双向链表真言喝酒伤身,健康第一。题目将一棵二叉树转换成双向链表。思路递归解决思路:先将左子树转换成一个双向链表list1再将右子树转换成一个双向链表list2最后将list1+根节点+list2合成一个链表code// function:binary tree to double directed linklist template<typename T> std::pair<btnode<T>*,btnode<T>*> binarytree<T>::_BinaryTreeToDoubleDirectedLinkedList(btnode<T>* p) {std::pair<btnode<T>*,btnod...

面试题23:链表中环的入口节点【代码】

考察链表的操作,找到单向链表中环的入口节点C++版#include <iostream> #include <algorithm> using namespace std;// 定义链表 struct ListNode{int val;struct ListNode* next;ListNode(int val):val(val),next(nullptr){} };// 在链表存在环的前提下找到一快一慢两个指针相遇的节点 ListNode* MeetingNode(ListNode* pHead){if(pHead == nullptr)return nullptr;// 定义走的慢节点ListNode* pSlow = pHead->next;if(pSlow == nu...

程序员面试金典-面试题 02.05. 链表求和【代码】

题目:给定两个用链表表示的整数,每个节点包含一个数位。这些数位是反向存放的,也就是个位排在链表首部。编写函数对这两个整数求和,并用链表形式返回结果。 示例:输入:(7 -> 1 -> 6) + (5 -> 9 -> 2),即617 + 295输出:2 -> 1 -> 9,即912进阶:假设这些数位是正向存放的,请再做一遍。示例:输入:(6 -> 1 -> 7) + (2 -> 9 -> 5),即617 + 295输出:9 -> 1 -> 2,即912分析:从两个链表头节点开始遍历,计算两个节点值的和,...

【LeetCode-面试算法经典-Java实现】【082-Remove Duplicates from Sorted List II(排序链表中删除重复元素II)】【代码】【图】

【082-Remove Duplicates from Sorted List II(排序链表中删除重复元素II)】【LeetCode-面试算法经典-Java实现】【所有题目目录索引】原题  Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct numbers from the original list. For example, Given 1->2->3->3->4->4->5, return 1->2->5. Given 1->1->1->2->3, return 2->3. 题目大意  给定一个排好序的单链表,删除所有重复...

[面试经典编程题]3 单链表判断是否回文【代码】【图】

单链表判断是否回文题目描述思路三个指针,分别n1,n2,n3;三个指针不断往后移动。1、总体思路找到中间节点,然后把后半个链表反转后与前半部分比较。(注意:奇数个链表的话是从中点的后一个节点逆置;偶数个链表的话从中间链表的节点逆置)2、问题是如何找到中间节点使用快慢指针,两指针一开始都指向head,那么fast一次2步,slow一次1步,那么fast走到最后的节点,slow刚好指向中间。Java代码方法1:借助快慢指针找到中间的节点,翻...

面试题18:删除链表中重复的结点【代码】

本题考查链表的操作。C++版本// 由于可能需要删除头结点,所以需要指向头结点的指针,即二级指针,有两种方式 // 方式一:参数声明为二级指针 ListNode** pHead; // 方式二:新建指向头结点的指针 ListNode* vHead = new ListNode(-1); vHead->next = pHead; #include <iostream> #include <algorithm> using namespace std;// 定义链表 struct ListNode{int val;struct ListNode* next;ListNode(int val):val(val),next(nullptr)...

[程序员代码面试指南]链表问题-向有序的环形链表插入新节点【代码】

题意给定非递减循环链表的头节点,和一个待插入的值,将其插入循环链表。题解遍历一遍,找到插入位置则返回;若没找到,说明插到头节点尾节点间,注意区分插入的是最大值还是最小值,返回的头节点不一样。代码public class Main {public static void main(String args[]) { //testNode n1=new Node(1);Node n2=new Node(1);Node n3=new Node(3);n1.next=n2;n2.next=n3;n3.next=n1;Node head=n1;int num=2;head=insertNode(h...

面试题17:合并两个排序的链表【代码】

题目描述输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的。例如输入图3.7中的链表1和链表2,则合并之后的升序链表如链表3所示。链表结点定义如下:题目分析剑指Offer(纪念版)P114代码实现ListNode* Merge(ListNode* pHead1, ListNode* pHead2) {if(pHead1 == NULL)return pHead2;else if(pHead2 == NULL)return pHead1;ListNode* pMergedHead = NULL;if(pHead1->m_nValue < pHead2->m_nValue){pM...