数据结构


自己写的笔记(单链表带有头节点,头节点不存储数据),方便日后查看!

反转

//单链表反转
    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 + '\'' +
                '}';
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值