自己写的笔记(单链表带有头节点,头节点不存储数据),方便日后查看!
反转
//单链表反转
public static void reserveList(Node head) {
//当前链表为空 或 只有一个节点 直接返回 无需反转
if (head.next == null || head.next.next == null) {
return;
}
Node temp = head.next;
Node reserveHead = new Node(0, "");
Node next;
//Node cur;
while (true) {
if (temp == null) {
break;
}
next = temp.next;
temp.next = reserveHead.next;
reserveHead.next = temp;
temp = next;
}
head.next = reserveHead.next;
}
逆序打印(栈)
public static void reservePrint(Node head) {
Stack<Node> stack = new Stack<>();
Node temp = head.next;
while (true) {
if (temp == null) {
break;
}
stack.push(temp);
temp = temp.next;
}
while (stack.size() > 0) {
System.out.println(stack.pop());
}
}
两个有序合并为一个有序
public static Node mergeTwoList(Node head1, Node head2) {
if (head1.next == null && head2.next == null) {
return null;
}
if (head1.next == null) {
return head2 ;
}
if (head2.next == null) {
return head1 ;
}
//合并后单链表头结点
Node head = head1.next.no < head2.next.no ? head1 : head2;
Node cur1 = head == head1 ? head1.next : head2.next;
Node cur2 = head == head1 ? head2.next : head1.next;
Node pre = null;//cur1前一个元素
Node next = null;//cur2的后一个元素
while (cur1 != null && cur2 != null) {
//第一次进来肯定走这里
if (cur1.no <= cur2.no ) {
pre = cur1;
cur1 = cur1.next;
} else {
next = cur2.next;
pre.next = cur2;
cur2.next = cur1;
pre = cur2;
cur2 = next;
}
}
pre.next = cur1 == null ? cur2 : cur1;
return head;
}
统计有效节点个数
public int getSize(){
if (head.next == null) {
return 0;
}
Node temp = head;
int length = 0;
while (true) {
if (temp.next == null) {
break;
}
length++;
temp = temp.next;
}
return length;
}
查找倒数第k个节点
public Node getConvertNode(int k){
//int index = getSize() - k;
Node temp = head.next;
if (k < 0 || k > getSize()) {
return null;
}
for (int i = 0; i < getSize() - k; i++) {
temp = temp.next;
}
return temp;
}
完整版
总代码
package test;
import java.util.Stack;
public class Link {
public static void main(String[] args) {
//Node node1 = new Node(1, "宋江");
Node node1 = new Node(1, "林冲");
Node node2 = new Node(2, "林冲");
Node node3 = new Node(3, "林冲");
Node node4 = new Node(4, "林冲");
Node node5 = new Node(5, "林冲");
Node node6 = new Node(6, "林冲");
Node node7 = new Node(7, "林冲");
LinkedList linkedList1 = new LinkedList();
LinkedList linkedList2 = new LinkedList();
linkedList1.addByOrder(node2);
linkedList1.addByOrder(node3);
linkedList1.addByOrder(node4);
linkedList1.addByOrder(node7);
linkedList2.addByOrder(node1);
linkedList2.addByOrder(node3);
linkedList2.addByOrder(node5);
linkedList2.addByOrder(node6);
// show(linkedList1.getHead());
// show(linkedList2.getHead());
Node head = mergeTwoList(linkedList1.getHead(), linkedList2.getHead());
//reserveList(linkedList.getHead());
//linkedList.reserve();
//System.out.println(linkedList.getConvertNode(3));
//linkedList.delete(4);
//linkedList.show();
// System.out.println(linkedList.getSize());
//reservePrint(linkedList.getHead());
show(head);
}
//单链表反转
public static void reserveList(Node head) {
//当前链表为空 或 只有一个节点 直接返回 无需反转
if (head.next == null || head.next.next == null) {
return;
}
Node temp = head.next;
Node reserveHead = new Node(0, "");
Node next;
//Node cur;
while (true) {
// if (temp.next == null) {
// break;
// }
// temp.next.next = reserveHead.next;
// reserveHead.next = temp;
// //temp.next = reserveHead.next.next;
// temp = temp.next;
if (temp == null) {
break;
}
next = temp.next;
temp.next = reserveHead.next;
reserveHead.next = temp;
temp = next;
}
head.next = reserveHead.next;
}
//逆序打印链表
public static void reservePrint(Node head) {
Stack<Node> stack = new Stack<>();
Node temp = head.next;
while (true) {
if (temp == null) {
break;
}
stack.push(temp);
temp = temp.next;
}
while (stack.size() > 0) {
System.out.println(stack.pop());
}
}
public static Node mergeTwoList(Node head1, Node head2) {
if (head1.next == null && head2.next == null) {
return null;
}
if (head1.next == null) {
return head2 ;
}
if (head2.next == null) {
return head1 ;
}
//合并后单链表头结点
Node head = head1.next.no < head2.next.no ? head1 : head2;
Node cur1 = head == head1 ? head1.next : head2.next;
Node cur2 = head == head1 ? head2.next : head1.next;
Node pre = null;//cur1前一个元素
Node next = null;//cur2的后一个元素
while (cur1 != null && cur2 != null) {
//第一次进来肯定走这里
if (cur1.no <= cur2.no ) {
pre = cur1;
cur1 = cur1.next;
} else {
next = cur2.next;
pre.next = cur2;
cur2.next = cur1;
pre = cur2;
cur2 = next;
}
}
pre.next = cur1 == null ? cur2 : cur1;
return head;
}
public static Node mergeTwoList1(Node head1, Node head2) {
if (head1.next == null && head2.next == null) {
return null;
}
if (head1.next == null) {
return head2;
}
if (head2.next == null) {
return head1;
}
Node head = head1.next.no > head2.next.no ? head2 : head1;
Node cur1 = head == head2 ? head2.next : head1.next;
Node cur2 = head == head2 ? head1.next : head2.next;
Node pre = null;
Node next = null;
while (cur1 != null && cur2 != null) {
if (cur1.no < cur2.no) {
pre = cur1;
cur1 = cur1.next;
} else {
next = cur2.next;
pre.next = cur2;
cur2.next = cur1;
pre = cur2;
cur2 = next;
}
}
pre.next = cur1 != null ? cur1 : cur2;
return head;
}
//显示链表
public static void show(Node head){
Node temp = head;
if (temp.next == null) {
System.out.println("链表为空!");
return;
}
while (true) {
if (temp.next == null) {
break;
}
System.out.println(temp.next);
temp = temp.next;
}
}
}
//定义链表类
class LinkedList{
//头节点
private Node head = new Node(0, "");
public Node getHead() {
return head;
}
//1.加入数据
public void add(Node node){
Node temp = head;
while (true) {
if (temp.next == null) {
break;
}
temp = temp.next;
}
temp.next = node;
}
public void addByOrder(Node newNode){
Node temp = head;
boolean flag = false;//是否存在
while (true) {
if (temp.next == null) {
break;
}
if (temp.next.no > newNode.no) {
break;
} else if (temp.next.no == newNode.no) {
flag = true;
break;
}
temp = temp.next;
}
if (flag) {
System.out.println("编号为" + newNode.no + "已存在");
} else {
newNode.next = temp.next;
temp.next = newNode;
}
}
//3.修改数据 根据no修改
public void update(Node newNode) {
Node temp = head;
boolean flag = false;//是否找到
while (true) {
if (temp.next == null) {
break;
}
if (temp.next.no == newNode.no) {
flag = true;
break;
}
temp = temp.next;
}
if (flag) {
//temp.next.no = newNode.no;
temp.next.name = newNode.name;
} else {
System.out.println("要修改的信息不存在!");
}
}
//4.删除数据
public void delete(int no) {
Node temp = head;
boolean flag = false;//是否找到
while (true) {
if (temp.next == null) {
break;
}
if (temp.next.no == no) {
flag = true;
break;
}
temp = temp.next;
}
if (false) {
temp.next = temp.next.next;
} else {
System.out.println("没有找到要删除的编号为" + no + "的节点");
}
}
//5.显示
public void show(){
Node temp = head;
if (temp.next == null) {
System.out.println("链表为空!");
return;
}
while (true) {
if (temp.next == null) {
break;
}
System.out.println(temp.next);
temp = temp.next;
}
}
//6.统计有效节点的个数
public int getSize(){
if (head.next == null) {
return 0;
}
Node temp = head;
int length = 0;
while (true) {
if (temp.next == null) {
break;
}
length++;
temp = temp.next;
}
return length;
}
//7.查找倒数第K个节点
public Node getConvertNode(int k){
//int index = getSize() - k;
Node temp = head.next;
if (k < 0 || k > getSize()) {
return null;
}
for (int i = 0; i < getSize() - k; i++) {
temp = temp.next;
}
return temp;
}
//8.单链表的反转
public void reserve(){
if (head.next == null || head.next.next == null) {
return;
}
Node reserveHead = new Node(0, "");
Node temp = head.next;
Node next;
while (true) {
if (temp == null) {
break;
}
next = temp.next;
temp.next = reserveHead.next;
reserveHead.next = temp;
temp = next;
}
head.next = reserveHead.next;
}
}
//定义节点类
class Node{
public int no;
public String name;
public Node next;
public Node(int no, String name) {
this.no = no;
this.name = name;
}
@Override
public String toString() {
return "Node{" +
"no=" + no +
", name='" + name + '\'' +
'}';
}
}