链表是面试中最常见的一种题型,因为他的每个题的代码短,短短的几行代码就可以体现出应聘者的编码能力,所以它也就成为了面试的重点。

链表常见的操作有1.打印链表的公共部分,2.删除链表的倒数第K个节点,3.翻转单向链表,4.环形约瑟夫环问题,5.判断链表是否是一个回文链表,6.两个链表生成相加链表,7.删除无序链表中重复出现的节点,8.删除指定值得节点,9.合并两个有序的单链表,10.环形链表的插入

import java.util.*;
/**********
*@Author:Tom-shushu
*@Description:链表问题
*@Date:21:58 2019/10/2
* .--, .--,
* ( ( \.---./ ) )
* '.__/o o\__.'
* {= ^ =}
* > - <
* / \
* // \\
* //| . |\\
* "'\ /'"_.-~^`'-.
* \ _ /--' `
* ___)( )(___
* (((__) (__))) 高山仰止,景行行止.虽不能至,心向往之。
*
**********/
public class Node {
public int value;
public Node head;
public Node next; public Node(int data) {
this.value = data;
} //打印链表的公共部分
public void print(Node head1, Node head2) {
while (head1 != null && head2 != null) {
if (head1.value < head2.value) {
head1 = head1.next;
} else if (head1.value > head2.value) {
head2 = head2.next;
} else {
System.out.println(head1.value);
head1 = head1.next;
head2 = head2.next;
}
}
} //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//删除单链表的倒数第K个节点
//版本一
public Node remove1(Node head, int k) {
if (head == null || k < 1) {
return head;
}
Node cur = head;
while (cur != null) {
k--;
cur = cur.next;
}
if (k == 0) {//要删除的是第一个
head = head.next;
}
if (k < 0) {
cur = head;
while (++k != 0) {
cur = cur.next;
}
cur.next = cur.next.next;
}
return head;
} //版本二
public Node remove2(Node head, int k) {
if (head == null || k <= 0) {
return null;
}
Node slow = head;
Node fast = head;
//fast 指向 k + 1
for (int i = 1; i < k + 1; i++) {
if (fast.next != null) {
fast = fast.next;
} else {
return null;
}
}
//fast指向尾部,slow指向倒数K+1,即 k 的前一个数。
while (fast.next != null) {
fast = fast.next;
slow = slow.next;
}
//删除第 k 个数。
slow = slow.next.next;
return head;
} //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//翻转单向链表
//版本一
public Node reList(Node head) {
Node pre = null;
Node next = null;
while (head != null) {
next = head.next;
head.next = pre;
pre = head;
head = next;
}
return pre;
} //版本二
public Node reList2(Node head) {
if (head == null || head.next == null) {
return head;
}
Node pre = head;
Node newHead = null;
while (pre != null) {
Node temp = pre.next;
pre.next = newHead;
newHead = pre;
pre = temp;
}
return newHead;
} //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//环形约瑟夫问题
public Node yuesefu(Node head, int m) {
if (head == null || head.next == head || m < 1) {
return head;
}
Node last = head;
while (last.next != head) {
last = last.next;
}
int count = 0;
while (head != last) {
if (++count == m) {
last.next = head.next;
count = 0;
} else {
last = last.next;
}
head = last.next;
}
return head;
} //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//判断一个链表是否是回文链表
public boolean isHuiWen(Node head) {
Stack<Node> stack = new Stack<Node>();
Node cur = head;
while (cur != null) {
stack.push(cur);
cur = cur.next;
}
while (head != null) {
if (head.value != stack.pop().value) {
return false;
}
head = head.next;
}
return true;
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //两个单链表生成相加链表
public Node xinagjialainbiao(Node head1, Node head2) {
Stack<Integer> stack1 = new Stack<Integer>();
Stack<Integer> stack2 = new Stack<Integer>();
while (head1 != null) {
stack1.push(head1.value);
head1 = head1.next;
}
while (head2 != null) {
stack2.push(head1.value);
head2 = head2.next;
}
int ca = 0;
int n1 = 0;
int n2 = 0;
int n = 0;
Node node = null;
Node pre = null;
while (!stack1.isEmpty() || !stack2.isEmpty()) {
if (stack1.isEmpty()) {
n1 = 0;
} else {
n1 = stack1.pop();
}
if (stack2.isEmpty()) {
n2 = 0;
} else {
n2 = stack2.pop();
}
pre = node;
node = new Node(n % 10);
node.next = pre;
}
if (ca == 1) {
pre = node;
node = new Node(1);
node.next = pre;
}
return node;
} //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//删除无需单链表中重复出现的节点
public void deletecf(Node head) {
if (head == null) {
return;
}
HashSet<Integer> set = new HashSet<Integer>();
Node pre = head;
Node cur = head.next;
set.add(head.value);
while (cur != null) {
if (set.contains(cur.value)) {
pre.next = cur.next;
} else {
set.add(cur.value);
pre = cur;
}
cur = cur.next;
}
} //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//在单链表中删除指定值得节点
public Node deletevalue(Node head, int num) {
Stack<Node> stack = new Stack<Node>();
while (head != null) {
if (head.value != num) {
stack.push(head);
}
head = head.next;
}
while (!stack.isEmpty()) {
stack.peek().next = head;
head = stack.pop();
}
return head;
} //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//合并两个有序单链表(递归)
public Node Merge(Node list1, Node list2) {
if (list1 == null) {
return list2;
}
if (list2 == null) {
return list1;
}
if (list1.value <= list2.value) {
list1.next = Merge(list1.next, list2);
return list1;
} else {
list2.next = Merge(list1, list2.next);
return list2;
}
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++==
//环形链表的插入
public Node insertNum(Node head,int num){
Node node = new Node(num);
if(head == null){
node.next = node;
return node;
}
Node pre = head;
Node cur = head.next;
while (cur != head){
if (pre.value <= num && cur.value >= num){
break;
}
pre = cur;
cur = cur.next;
}
pre.next = node;
node.next = cur;
return head.value < num ? head : node;
}
}

链表常见的题型(java实现)的更多相关文章

  1. java实现单链表常见操作

    一.概述: 本文主要总结单链表常见操作的实现,包括链表结点添加.删除:链表正向遍历和反向遍历.链表排序.判断链表是否有环.是否相交.获取某一结点等. 二.概念: 链表: 一种重要的数据结构,HashM ...

  2. java 链表常见题目

    如何判断单链表是否存在环 方法一.穷举遍历方法一:首先从头节点开始,依次遍历单链表的每一个节点.每遍历到一个新节点,就从头节点重新遍历新节点之前的所有节点,用新节点ID和此节点之前所有节点ID依次作比 ...

  3. Java 链表常见考题总结

    首先定义自定义结点类,存储节点信息: public class Node { Node next=null; int data; public Node(int data){ this.data=da ...

  4. Java链表常见操作【剑指Offer】03:从尾到头打印链表

    题目描述 输入一个链表,按链表从尾到头的顺序返回一个ArrayList. 题解一:递归 /* 在最后一次递归方法返回以后,每一层的递归方法都会做一个arrayList.add(listNode.val ...

  5. insertion Sort List (链表的插入排序) leecode java

    逻辑简单,代码难写,基础不劳,leecode写注释不能出现中文,太麻烦,我写了大量注释,链表问题最重要的就是你那个指针式干啥的 提交地址https://oj.leetcode.com/problems ...

  6. 常见数据结构的Java实现

    单链表的Java实现 首先参考wiki上的单链表说明,单链表每个节点包含数据和指向链表中下一个节点的指针或引用.然后看代码 import java.lang.*; public class Singl ...

  7. 常见排序的JAVA实现和性能测试

    五种常见的排序算法实现 算法描述 1.插入排序 从第一个元素开始,该元素可以认为已经被排序 取出下一个元素,在已经排序的元素序列中从后向前扫描 如果该元素(已排序)大于新元素,将该元素移到下一位置 重 ...

  8. 链表的原理及java实现

    一:单向链表基本介绍 链表是一种数据结构,和数组同级.比如,Java中我们使用的ArrayList,其实现原理是数组.而LinkedList的实现原理就是链表了.链表在进行循环遍历时效率不高,但是插入 ...

  9. 剑指Offer-25.复杂链表的复制(C++/Java)

    题目: 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head.(注意,输出结果中请不要返回参数中的节点引用,否则 ...

随机推荐

  1. 微软发布了开发社区采用.NET Standard的最新信息

    最近,微软发布了开发社区当前采用.NET Standard的最新信息..NET Standard是API的正式规范,现有.NET实现在不同平台的是通用的(从而允许跨平台开发).当前规范(版本2.0)在 ...

  2. BadBoy+JMeter来录制和运行Web测试脚本

    参考: http://jingyan.baidu.com/article/5d368d1ef548d43f61c05761.html http://www.51testing.com/html/00/ ...

  3. 牛客网暑期ACM多校训练营(第三场) A PACM Team 01背包 记录路径

    链接:https://www.nowcoder.com/acm/contest/141/A来源:牛客网 Eddy was a contestant participating in ACM ICPC ...

  4. 天梯杯 PAT L2-001. 紧急救援 最短路变形

    作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市的救援队数量和每一条连接两个城市的快速道路长度都标在地图上.当其他城市有紧急求 ...

  5. 【Offer】[20] 【表示数值的字符串】

    题目描述 思路分析 测试用例 Java代码 代码链接 题目描述 请实现一个函数用来判断字符串是否表示数值(包括整数和小数).例如,字符串"+100","5e2" ...

  6. c语言实现双色球和大乐透

    头文件: #include<stdio.h> #include <stdlib.h> #include<string.h> #include <time.h& ...

  7. SpringBoot系列__02HelloWorld探究

    在前文中,我们创建了一个简单的hello world,现在,利用这个简单的程序,来简单分析一下SpringBoot的启动过程. 如果你是使用过SSM框架的人,尤其是4.0之前的版本,相信你使用过xml ...

  8. lambda表达式与匿名内部类与双冒号(::)

    lambda表达式在只有一条代码时还可以引用其他方法或构造器并自动调用,可以省略参数传递,代码更加简洁,引用方法的语法需要使用::符号.lambda表达式提供了四种引用方法和构造器的方式: 引用对象的 ...

  9. nginx部署成功却没有办法访问

    1.首要想到的问题是防火墙没关 注意:因为centos7.0默认不是使用iptables方式管理,而是firewalld方式.CentOS6.0防火墙用iptables管理. 2.解决: ①首先查看防 ...

  10. Could not calculate build plan :lugin org.apache.maven.plugins:maven-resources-plugin:2.6 or one of

    eclipse中新建maven项目,出现 Could not calculate build plan :lugin org.apache.maven.plugins:maven-resources- ...