本题要求实现一个函数,求单链表L结点的阶乘和.这里默认所有结点的值非负,且题目保证结果在int范围内. 函数接口定义: int FactorialSum( List L ); 其中单链表List的定义如下: typedef struct Node *PtrToNode; struct Node { int Data; /* 存储结点数据 */ PtrToNode Next; /* 指向下一个结点的指针 */ }; typedef PtrToNode List; /* 定义单链表类型 */ 裁判测…
问题:求单链表倒数第m个结点,要求不准求链表的长度,也不许对链表进行逆转 解:设置两个指针p和q,p.q指向第一个结点.让p先移动到链表的第m个结点,然后p和q同时向后移动,直到p首先到达尾结点.此时,q结点落后p (m-1)个结点,q所指向的结点就是单链表的倒数第m个结点. 算法实现: linkNode *searchLinkM(linkNode *link,int m) { linkNode *p=link->next; ) { ;i<m;i++) { p=p->next; if(p…
[说明]: 本文是左程云老师所著的<程序员面试代码指南>第二章中“将单链表的每K个节点之间逆序”这一题目的C++复现. 本文只包含问题描述.C++代码的实现以及简单的思路,不包含解析说明,具体的问题解析请参考原书. 感谢左程云老师的支持. [题目]: 给定一个单链表的头节点 head,实现一个调整单链表的函数,使得每K个节点之间逆序,如果最后不够K个节点一组,则不调整最后几个节点. 例如: 链表:1->2->3->4->5->6->7->8->N…
前言 以专题的形式更新刷题贴,欢迎跟我一起学习刷题,相信我,你的坚持,绝对会有意想不到的收获.每道题会提供简单的解答,如果你有更优雅的做法,欢迎提供指点,谢谢. 注:如果代码排版出现了问题麻烦通知我下,谢谢. [题目描述] 给定一个单链表的头节点head, 实现一个调整单链表的函数,使得每K个节点之间逆序,如果最后不够K个节点一组,则不调整最后几个节点. 例如: 链表:1->2->3->4->5->6->7->8->null, K = 3. 调整后:3-&g…
本题要求实现一个函数,求单链表L结点的阶乘和.这里默认所有结点的值非负,且题目保证结果在int范围内. 时间限制: 400ms 内存限制: 64MB 代码长度限制: 16KB 函数接口定义: int FactorialSum( List L ); 其中单链表List的定义如下: typedef struct Node *PtrToNode; struct Node { int Data; /* 存储结点数据 */ PtrToNode Next; /* 指向下一个结点的指针 */ }; typed…
将单链表的每K个节点之间逆序 给定一个单链表的头节点head,实现一个调整链表的函数,使得每K 个节点之间逆序,如果最后剩下不够K 个节点,则不调整最后几个. 例如: 链表:1—>2—>3—>4—>5—>6—>7—>8—>null,k=3. 调整好后:3—>2—>1—>6—>5—>4—>7—>8—>null,其中7.8不调整,因为不够一组. [解析] 1. 首先从左到右遍历链表,如果栈的大小不等于k ,则不断的…
题目传送门:https://leetcode-cn.com/problems/reverse-linked-list/ 文章目录 单链表介绍 链表 概念 种类 优缺点 单链表(slist) leetcode206题反转单链表 题目描述 python实现 思路 完整代码 单链表介绍 链表 概念 链表(linked list)是由一组被称为结点的数据元素组成的数据结构,每个结点都包含结点本身的信息和指向下一个结点的地址.由于每个结点都包含了可以链接起来的地址信息,所以用一个变量就能够访问整个结点序列…
思路1:定义两个指针变量p和q,初始时均指向头节点的下一个节点(链表的第一个节点),p指针沿链表移动: 当p指针移动到第k个节点时,q指针开始与p指针同步移动, 当p指针移动到最后一个节点时,q指针所指节点就是倒数第k个节点. 思路2:利用栈实现,遍历链表依次入栈,然后出k次栈就找到那个节点了. 1.定义栈结构typedef struct{ int length; ]; }Stack; void push(Stack &s,int v){ if(s.length <= 50){ s.valu…
前言 以专题的形式更新刷题贴,欢迎跟我一起学习刷题.每道题会提供简单的解答. 题目描述 在单链表中删除倒数第 K 个节点 要求 如果链表的长度为 N, 时间复杂度达到 O(N), 额外空间复杂度达到 O(1) 难度 士 解答 删除的时候会出现三种情况: 1.不存在倒数第 K 个节点,此时不用删除 2.倒数第 K 个节点就是第一个节点 3.倒数第 K 个节点在第一个节点之后 所以我们可以用一个变量 sum 记录链表一共有多少个节点. 如果 num < K,则属于第一种情况. 如果 num == K…
给定一个单链表,设计一个算法实现链表向右旋转 K 个位置. 举例: 给定 1->2->3->4->5->6->NULL, K=3 则     4->5->6->1->2->3->NULL 分析: 1. 这道题目的关键在于找到 尾节点和旋转后新链表的尾节点. 假设是 tail, new->tail. 然后只要进行 tail->next  = head; head = new_tail->next; new_tail-&…
单链表逆序输出也是常被面试官问到题算法题,所以自己就总结了一下,在此贴出算法,与小伙伴们相互交流. 首先要有三个指针,前两个分别指向首节点,首节点的下一个节点,第三个是临时指针,是为了储存首节点的下一个节点的下一个节点,防止链表断裂 图1 输出函数一共两个参数,第一个是链表本身,第二是K值 首先让new等于头结点的next节点,old为new结点的next节点 为了让逆序输出,必须定义一个计数器count,count初值为1,用于终止循环的条件. 每次循环,必须先指定temp节点为old的nex…
题目 给定一个单链表的头结点,实现一个调整单链表的函数,使得每K个节点之间逆序,如果最后不够K个节点一组,则不调整最后几个节点. 解答 使用栈结构 import java.util.Stack; public class Test{ static class Node{ public int val; public Node next; public Node(int val){ this.val=val; } } public static void main(String[] args) {…
给定一个单链表的表头节点head,实现一个调整单链表的函数,是的每k个节点之间逆序,如果最后不够k个节点一组,则不调整最后几个节点 思路: 如果k的值小于2,不调整.k<1 没有意义,k==1代表1个节点为1组进行逆序,原链表不变. 介绍两种方法: 方法一  利用栈结构 1.从左到右便利链表,如果栈的大小不等于k,就将节点不断压入栈中 2.当栈大小第一次到达k,凑齐了k个节点进行逆序.然后弹出,并且连接.第一组逆序完成后,记录新的头,同时第一组最后一个(原头)连接下一个节点 package TT…
[题目]给定一个单链表的头节点head,实现一个调整单链表的函数,使得每K个节点之间逆序,如果最后不够K个节点一组,则不调整最后几个节点.例如:链表:1->2->3->4->5->6->7->8->null,K = 3.调整后为:3->2->1->6->5->4->7->8->null.其中7.8不调整,因为不够一组.[解题思路]方法一:使用栈,每K个节点依次入栈,并依次删除然后栈弹出尾插法插入节点方法二:直接…
题目描述 给定一个单链表的表头节点head,实现一个调整单链表的函数,是的每k个节点之间逆序,如果最后不够k个节点一组,则不调整最后几个节点. 题解 内部函数reverse实现链表beg到end的翻转,以及与l和r的连接. 外部函数reverseKNodes实现区间的移动(即四个实参的更新),以及整个链表头节点的赋值. 时间复杂度O(n),额外空间复杂度O(1) 代码 public class Main { public static void main(String args[]) { Nod…
链表需要用到指针 阶乘需要用到递归 链表中的注意事项: 1.链表L是否等于NULL ----------是循环结束的条件 2.链表L->Data ---------取链表L中各个结点的值 3.L=L->next  --------相当于++i  i++  是循环的条件 使得结点指向下一个结点 递归很简单的思想: 1.当n=0 或n=1时    返回1 2.否则    返回n*fun(n-1); 代码如下: int fun (int n){ if(n==0 ||n==1){ return 1;…
#!/usr/bin/env python class Node(object): def __init__(self,elem,next_=None): self.elem = elem self.next = next_ class Simple_List(object): def __init__(self): self.head = None def is_empty(self): return self.head == None def prepend(self,elem): self…
#include <iostream> using namespace std; struct node{ int value; struct node *next; }; struct node *head; void insert(struct node * &head,int value) { if(head == NULL) { head = new struct node; head->value = value; head->next = NULL; retur…
Given a list, rotate the list to the right by kplaces, where k is non-negative. For example:Given1->2->3->4->5->NULLand k =2,return4->5->1->2->3->NULL. /** * Definition for singly-linked list. * struct ListNode { * int val; *…
#include<iostream>using namespace std;#include<malloc.h>#include<stdio.h>typedef int Elem;typedef struct AA{ Elem data; struct AA *next;}A;void Create(A *&L,Elem a[],int n){ A *r,*s; L=(A *)malloc(sizeof(A)); r=L; for(int i=0;i<n;…
最近在牛客网上练习在线编程,希望自己坚持下去,每天都坚持下去练习,给自己一个沉淀,不多说了 我遇到了一个用java实现单链表的题目,就自己在做题中将单链表完善了一下,希望大家作为参考也熟悉一下,自己 比较喜欢用java语言,所以就使用java实现单链表了. 为了方便,带头结点的单链表更容易操作和使用,即第一个节点不存储值,可以存储一些标记等 一.创建单链表结构ListNode /** * @ProjectName: JavaPractice * @Package: com.itwang.swor…
  题目描述:   输入一个链表,输出该链表中倒数第k个结点.为了符合习惯,从1开始计数,即链表的尾结点是倒数第1个节点.例如,一个链表有6个结点,从头结点开始,它们的值依次是1,2,3,4,5,6.则这个链表倒数第三个结点是值为4的结点.   解题思路:   对于单链表来说,没有从后向前的指针,因此一个直观的解法是先进行一次遍历,统计出链表中结点的个数n,第二次再进行一次遍历,找到第n-k+1个结点就是我们要找的结点,但是这需要对链表进行两次遍历.   为了实现一次遍历,我们这里采用双指针解法…
本题来自<剑指offer> 链表中倒数第k个节点 题目: 输入一个链表,输出该链表中倒数第k个结点. 思路: 倒数第k个节点,而且只能访问一遍链表,定义两个节点,两者之间相差k个距离,遍历到尾节点,则便找到了倒数k节点了. 考虑代码的鲁棒性.代码的鲁棒是指程序能够判断输入是否合乎规范要求,并对不合理的输入给予合理的处理. 1.如果传入的根节点是空:直接返回空 2.传入的数据少于k个:在遍历前k个节点时候,如果发现为空,则直接返回空 3.传入的k为小于或者等于0:直接返回空 4.正常的数据,fi…
我们在做算法的时候或多或少都会遇到这样的问题,那就是我们需要获取某一个数据集的倒数或者正数第几个数据.那么今天我们来看一下这个问题,怎么去获取倒数第K个节点.我们拿到这个问题的时候自然而然会想到我们让链表从末尾开始next   K-1 次不就是第K-1个节点了么,但是必须要注意一点,这是单向链表.那么这时候的解决思路或许就会出现分歧,大多数人都会想到我们遍历一下链表,获取链表的长度,然后再减去 K 长度的节点,那么我们这个链表的最后一个节点就是原链表的倒数第K个节点:我们看一下实现代码: /**…
在单链表和双链表中删除倒数第K个节点 分别实现两个函数,一个可以删除单链表中的倒数第K个节点,一个可以删除双链表中的倒数第k 个节点,要求时间复杂度是 O(N),空间复杂度是 O(1). [解析] 基本思路: 让链表从头开始走到尾,每移动一步,就让k值减一,当k 值走到结尾时, 如果k 值大于0,说明链表根本没有倒数第k 个节点 如果等于0,那么头节点就是倒数第k 个节点,此时应该返回 head.next 如果小于0,则重新从头节点开始,每移动一步,k 值增加一,当k 等于0时,移动停止,移动到…
1.一种较笨的办法是先将链表元素入栈,然后出栈找到倒数第k个节点值,再拿着值遍历链表去找到对于节点. 时间复杂度:O(n) (3n 遍历-出栈-遍历) 空间复杂度:O(n) (一个栈) 2.快慢指针,要注意边界值的处理. 时间复杂度:O(n) 空间复杂度:O(1)只额外需要一个指针的空间. /* struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { } };*/ class…
头文件Linear.h // 单链表的类型定义 typedef struct node { int data; // 数据域 struct node *next; // 指针域 }Node, *LinkList; 因为单链表头结点和插入的结点要动态生成,所以要引入系统头文件<stdlib.h>或者<malloc.h>,不然会报错. 1. 初始化单链表 LinkList InitiateLinkList() { LinkList head; // 头指针 head = malloc(…
# -*- coding:utf-8 -*- # class ListNode: # def __init__(self, x): # self.val = x # self.next = None class Solution: def FindKthToTail(self, head, k): # write code here # 先考虑k若大于链表的长度,返回None,链表的长度咋算,不太会,可以在遍历的时候count+1 # 我的思路是,从头到尾遍历链表,将其存在list中,如果len…
总结提高,与君共勉 概述. 数据结构与算法亘古不变的主题,链表也是面试常考的问题,特别是手写代码常常出现,将从以下方面做个小结 [链表个数] [反转链表-循环] [反转链表-递归] [查找链表倒数第K个节点] [查找链表中间节点] [判断链表是否有环] [从尾到头打印单链表-递归] [从尾到头打印单链表-栈] [由小到大合并有序单链表-循环] [由小到大合并有序单链表-递归] 通常在java中这样定义单链表结构 <span style="font-family:Microsoft YaHe…
1.编程实现单链表删除节点.       解析:如果删除的是头节点,如下图: 则把head指针指向头节点的下一个节点.同时free p1,如下图所示: 如果删除的是中间节点,如下图所示: 则用p2的next指向p1的next同时,free p1 ,如下图所示: 2.编写程序实现单链表的插入.       解析:单链表的插入,如下图所示: 如果插入在头结点以前,则p0的next指向p1,头节点指向p0,如下图所示: 如果插入中间节点,如下图所示: 则先让p2的next指向p0,再让p0指向p1,如…