主頁 >  其他 > 資料結構-鏈表

資料結構-鏈表

2020-09-14 05:18:33 其他

單鏈表練習

介紹

image-20200529223626146

  1. 鏈表以結點的方式儲存,鏈式存盤

  2. 每個結點包含data域,next域

  3. 鏈表的結點可以是連續的,也可以是不連續的

  4. 鏈表分類

    • 帶頭結點的鏈表

      image-20200529224047860

    • 沒有頭結點的鏈表

應用實體

題目:使用帶head頭的單冋鏈表實作ˉ水滸英雄排行榜管理完成對英雄人物的増刪改査操作,

功能需求

  • 在添加英雄時,直接添加到鏈表的尾部

  • 在添加英雄時,根據排名將英雄插入到指定位置(如果有這個排名,則添加失敗,并給出提示)

  • 修改節點資料

  • 洗掉節點

代碼實作

單鏈表代碼

package com.linkedlist;

public class SingleLinkedList {
    // 先初始化一個頭結點,頭結點是尋找鏈表開始,不要動它
    private HeroNode head = new HeroNode(0, "", "");

    public HeroNode getHead() {
        return head;
    }

    public void setHead(HeroNode head) {
        this.head = head;
    }

    /**
     * 頭插法添加新節點
     */
    public void addHead(HeroNode heroNode) {
        heroNode.next = head.next;
        head.next = heroNode;
    }

    /**
     * 尾插法添加新節點
     * @param heroNode 新節點
     */
    public void add(HeroNode heroNode) {
        // 1.首先遍歷到尾結點
        HeroNode temp = head;
        while (temp.next != null) {
            temp = temp.next;
        }
        // 2.將尾結點的next指向新節點
        temp.next = heroNode;
    }

    /**
     * 根據排名插入資料
     * @param heroNode 新節點
     */
    public void addByOrder(HeroNode heroNode) {
        // 1.首先找到新節點的插入位置
        HeroNode temp = head;
        // 如果找到尾結點還沒有找到合適的位置,則尾插到最后
        while (temp.next != null && temp.next.no <= heroNode.no) {
            temp = temp.next;
            if (temp.no == heroNode.no) {
                System.out.println(heroNode.name+"已存在,不可添加");
                return;
            }
        }
        // 2.新節點指向后節點
        heroNode.next = temp.next;
        // 3.原節點指向新節點
        temp.next = heroNode;
    }

    /**
     * 根據編號更新節點資料
     */
    public void update(HeroNode heroNode) {
        // 1.首先找到新節點的插入位置
        HeroNode temp = head;
        while (temp.next != null && temp.no != heroNode.no) {
            temp = temp.next;
        }
        // 如果跳出回圈還沒有匹配,就是找不到對應的節點
        if (temp.no != heroNode.no) {
            System.out.println("該編號不存在");
        } else {
            temp.name = heroNode.name;
            temp.nickname = heroNode.nickname;
        }
    }

    /**
     * 洗掉節點
     */
    public void delete(int no) {
        // 首先找到洗掉節點的【前一個】節點
        HeroNode temp = head;
        while (temp.next != null && temp.next.no != no) {
            temp = temp.next;
        }
        // 如果沒沒有遍歷到最后一個節點說明找到了匹配的節點
        if (temp.next != null) {
            // 跳過匹配節點的鏈接
            temp.next = temp.next.next;
        } else {
            System.out.println(no + "節點不存在");
        }
    }
    /**
     * 列印鏈表資訊
     */
    public void list() {
        if (head.next == null) {
            System.out.println("鏈表為空");
            return;
        }
        // 臨時變數遍歷
        HeroNode temp = head;
        while (temp.next != null) {
            temp = temp.next;
            System.out.println(temp.toString());
        }
    }

}

/**
 * 定義一個節點
 */
class HeroNode {
    public int no;
    public String name;
    public String nickname;
    public HeroNode next;


    public HeroNode() {
    }

    public HeroNode(int no, String name, String nickname) {
        this.no = no;
        this.name = name;
        this.nickname = nickname;
    }

    @Override
    public String toString() {
        return "HeroNode{" +
                "no=" + no +
                ", name='" + name + '\'' +
                ", nickname='" + nickname + '\'' +
                '}';
    }
}

測驗代碼

package com.linkedlist;

public class Application {
    public static void main(String[] args) {
        HeroNode hero1 = new HeroNode(1, "宋江", "及時雨");
        HeroNode hero2 = new HeroNode(2, "李逵", "黑旋風");
        HeroNode hero3 = new HeroNode(3, "林沖", "豹子頭");

        // 創建鏈表
        SingleLinkedList singleLinkedList = new SingleLinkedList();

        // 頭插法 頭插和尾插沒有做存在判斷,可能會出現死回圈,
//        singleLinkedList.addHead(hero1);
//        singleLinkedList.addHead(hero2);
//        singleLinkedList.addHead(hero3);

        // 尾插法添加節點
//        singleLinkedList.add(hero1);
//        singleLinkedList.add(hero3);
//        singleLinkedList.add(hero2);


        // 按照序號排序添加節點
        singleLinkedList.addByOrder(hero2);
        singleLinkedList.addByOrder(hero1);
        singleLinkedList.addByOrder(hero3);
        singleLinkedList.addByOrder(hero3);

        // 顯示所有資料
        singleLinkedList.list();

        // 修改節點資料
        HeroNode newNode = new HeroNode(1, "小宋", "下大雨");
        singleLinkedList.update(newNode);

        System.out.println("=====修改節點后=====");
        singleLinkedList.list();

        // 洗掉節點資料
        System.out.println("=====洗掉程序=====");
        singleLinkedList.delete(1);
        singleLinkedList.delete(3);
        singleLinkedList.delete(4);
        System.out.println("=====洗掉節點后=====");
        singleLinkedList.list();
    }
}

練習

  1. 求單鏈表有效節點的個數
    • 從第一個有效節點開始后移,計數
  2. 【新浪】查找單鏈表倒數第k個資料
    • 先獲取有效節點個數
    • 再從第一個有效節點后移size-k次
  3. 【騰訊】反轉單鏈表
    • 創建一個新的頭節點(看作臨時鏈表)
    • 遍歷原鏈表依次將節點用頭插法存到新頭節點(記得儲存當前節點的下一個節點next)
    • 原頭節點指向新頭節點的第一個有效節點
  4. 【百度】從尾到頭列印單鏈表(方式一:反向遍歷 方式二:Stack)
    • 呼叫堆疊的API,遍歷單鏈表將節點壓入堆疊中
    • 出堆疊列印
  5. 合并兩個單鏈表,合并之后仍然有序
    • 首先比較兩鏈表的長度,將短的鏈表拼接到長的鏈表
    • 遍歷短的鏈表,呼叫長鏈表按編號插入的方法將節點插入

練習代碼實作

package com.linkedlist;

import java.util.Stack;

public class practice {
    public static void main(String[] args) {
        // 創建鏈表
        SingleLinkedList singleLinkedList = new SingleLinkedList();

        // 按照序號排序添加節點
        singleLinkedList.addByOrder(new HeroNode(2, "李逵", "黑旋風"));
        singleLinkedList.addByOrder(new HeroNode(1, "宋江", "及時雨"));
        singleLinkedList.addByOrder(new HeroNode(3, "林沖", "豹子頭"));

        // 顯示鏈表當前情況
        singleLinkedList.list();

        // 1.求單鏈表有效節點的個數
        System.out.println("1.當前鏈表有效節點個數為:" + getSingleLinkedListLength(singleLinkedList));

        // 2.【新浪】查找單鏈表倒數第k個資料
        // 假設鏈表資料 頭 1 2 3 ,有效長度:3 , 找倒數第1個資料 ,只需要從第一個節點向后移3-1次
        HeroNode res = findLastIndexNode(singleLinkedList, 1);
        System.out.println("2.res=" + res);

        // 3.【騰訊】反轉單鏈表
//        reversalSingleLinkedList(singleLinkedList);
//        singleLinkedList.list();

        // 4.【百度】從尾到頭列印單鏈表(方式一:反向遍歷 方式二:Stack)
        System.out.println("4.逆序列印單鏈表,不破壞原鏈表");
        singleLinkedList.list();
        System.out.println("逆序列印");
        reversalPrint(singleLinkedList);

        // 5. 合并兩個單鏈表,合并之后仍然有序,
        SingleLinkedList list1 = new SingleLinkedList();
        SingleLinkedList list2 = new SingleLinkedList();
        list1.addByOrder(new HeroNode(2, "李逵", "黑旋風"));
        list1.addByOrder(new HeroNode(1, "宋江", "及時雨"));
        list1.addByOrder(new HeroNode(3, "林沖", "豹子頭"));

        list2.addByOrder(new HeroNode(4, "吳用", "智多星"));
        list2.addByOrder(new HeroNode(1, "宋江", "及時雨"));
//        list2.addByOrder(new HeroNode(5, "宋江", "及時雨"));
//        list2.addByOrder(new HeroNode(6, "宋江", "及時雨"));
//        list2.addByOrder(new HeroNode(7, "宋江", "及時雨"));

        System.out.println("+++++++二合一+++++++++++");
        System.out.println("鏈表1原資料");
        list1.list();
        System.out.println("鏈表2原資料");
        list2.list();

        boolean list1Long = true;
        // 如果鏈表1的長度大于鏈表2長度,則將鏈表2合并到鏈表1,呼叫鏈表的按編號插入方法
        if (getSingleLinkedListLength(list1) > getSingleLinkedListLength(list2)) {
            combineSingleLinkedList(list1, list2);
        } else {
            list1Long = false;
            combineSingleLinkedList(list2, list1);
        }
        System.out.println("合并后");
        if (list1Long) {
            list1.list();
        } else {
            list2.list();
        }
    }

    /**
     * 將鏈表2合并到鏈表1
     * @param list1 1
     * @param list2 2
     */
    private static void combineSingleLinkedList(SingleLinkedList list1, SingleLinkedList list2) {
        // 如果鏈表2 無資料直接回傳
        if (list2 == null || list2.getHead() == null) {
            return;
        }
        HeroNode cur2 = list2.getHead().next;
        HeroNode next2 = null;

        while (cur2 != null) {
            next2 = cur2.next;
            list1.addByOrder(cur2);
            cur2 = next2;
        }
    }

    private static void reversalPrint(SingleLinkedList singleLinkedList) {
        if (singleLinkedList == null || singleLinkedList.getHead() == null) {
            System.out.println("鏈表為空");
            return;
        }
        Stack<HeroNode> heroNodes = new Stack<>();
        HeroNode cur = singleLinkedList.getHead().next;
        while (cur != null) {
            heroNodes.push(cur);
            cur = cur.next;
        }

        while (!heroNodes.empty()) {
            System.out.println(heroNodes.pop());
        }
    }

    public static int getSingleLinkedListLength(SingleLinkedList list) {
        if (list == null || list.getHead().next == null) {
            return 0;
        }
        // 因為頭結點不算有效資料,將它視為第0個,后移一次加一個
        HeroNode cur = list.getHead();
        int length = 0;
        while (cur.next != null) {
            cur = cur.next;
            length++;
        }
        return length;
    }

    private static HeroNode findLastIndexNode(SingleLinkedList singleLinkedList, int n) {
        if (singleLinkedList == null || singleLinkedList.getHead() == null) {
            return null;
        }
        // 獲取鏈表的有效長度
        int size = getSingleLinkedListLength(singleLinkedList);
        // 檢查查找的下標的有效性
        if (n <= 0 || n > size) {
            return null;
        }
        // 從第一個結點開始移動,移動size - n 次
        HeroNode cur = singleLinkedList.getHead().next;
        for (int i = 0; i < size - n; i++) {
            cur = cur.next;
        }
        return cur;
    }

    private static void reversalSingleLinkedList(SingleLinkedList list) {
        // 只有一個節點時也不需要反轉
        if (list == null || list.getHead().next == null || list.getHead().next.next == null) {
            return;
        }
        // 定義一個新的頭節點,帶領新隊伍
        HeroNode newHead = new HeroNode();
        // 從第一個節點開始遍歷
        HeroNode cur = list.getHead().next;
        // 記錄后一個節點
        HeroNode next = null;

        while (cur != null) {
            next = cur.next;
            cur.next = newHead.next;
            newHead.next = cur;
            cur = next;
        }

        list.getHead().next = newHead.next;
    }
}

回圈鏈表

回圈鏈表:將單鏈表中終端結點的指標端由空指標改為指向頭結點,就使整個單鏈表形成個環,

其實就是頭尾相連的單鏈表,

應用場景(約瑟夫問題)

Joseph問題為:設編號為1,2,…n的n個人圍坐一圈,約定編號為k(1<=k<=n)的人從1開始報數,數到m的那個人出列,

它的下一位又從1開始報數,數到m的那個人又出列,依次類推,直到所有人出列為止,由此產生一個出隊編號的序列,

解決思路

image-20200530184742139

實作代碼

package com.linkedlist;

public class Joseph {
    public static void main(String[] args) {
        //Joseph問題為:
        // 設編號為1,2,…n的n個人圍坐一圈,約定編號為k(1<=k<=n)的人
        // 從1開始報數,數到m的那個人出列,
        // 它的下一位又從1開始報數,數到m的那個人又出列
        // 依次類推,直到所有人出列為止,由此產生一個出隊編號的序列,
        // 例如:5個人,從1號開始報數,報到2出列
        start(5, 1, 2);
    }

    private static void start(int n, int k, int m) {
        CircleSingleLinkedList circleSingleLinkedList = new CircleSingleLinkedList();
        // 添加n個小朋友 1 2 3
        for (int i = 1; i <= n; i++) {
            Node node = new Node(i);
            circleSingleLinkedList.add(node);
        }
        // 約定k號開始報數,進行鏈表偏移
        circleSingleLinkedList.offset(k);

        // 數到2,依次出隊
        System.out.print("出列順序為:");
        for (int i = 0; i < n; i++) {
            circleSingleLinkedList.out(m);
        }
    }
}

/**
 * 單向回圈鏈表
 */
class CircleSingleLinkedList {
    // 創建一個頭結點
    private Node first;

    public void add(Node node) {
        if (first == null) {
            first = node;
            first.setNext(node);
        }
        Node temp = first;
        while (temp.getNext() != first) {
            temp = temp.getNext();
        }
        temp.setNext(node);
        // 回圈鏈表相比于單向鏈表多了最后一個節點指向頭節點,
        node.setNext(first);
    }

    public void offset(int k) {
        if (first == null) {
            System.out.println("空?");
            return;
        }
        // 第一個節點向后偏移
        for (int i = 0; i < k - 1; i++) {
            first = first.getNext();
        }

    }

    public void out(int k) {
        // 校驗移動值
        if (k < 1) {
            System.out.println("k例外");
            return;
        }
        if (first == null) {
            System.out.println("沒人了");
            return;
        }

        Node temp = first;
        // 首先將temp指向最后一個節點
        while (temp.getNext() != first) {
            temp = temp.getNext();
        }

        // 從1開始報數,報數到k
        for (int i = 0; i < k - 1; i++) {
            first = first.getNext();
            temp = temp.getNext();
        }
        System.out.print(first.getNo() + "\t");
        first = first.getNext();
        temp.setNext(first);
    }

    public void list() {
        if (first == null) {
            System.out.println("鏈表為空");
            return;
        }

        Node temp = first;
        // 先列印再判斷
        do {
            System.out.println(temp.getNo());
            temp = temp.getNext();
        } while (temp != first);

    }
}

/**
 * 單向鏈表的節點
 */
class Node {
    private int no;
    private Node next;

    public Node() {
    }

    public Node(int no) {
        this.no = no;
    }

    public int getNo() {
        return no;
    }

    public void setNo(int no) {
        this.no = no;
    }

    public Node getNext() {
        return next;
    }

    public void setNext(Node next) {
        this.next = next;
    }
}

雙向鏈表

使用單鏈表時的缺點分析:

  • 查找方向只能是一個方向,不能往前查找
  • 不能自我洗掉,需要借助臨時結點

介紹

雙向鏈表其實就是在單向鏈表的基礎上添加的一個指向父結點的變數pre

image-20200530150846687

雙鏈表實作代碼

package com.linkedlist;

/**
 * 定義一個節點
 */
class HeroNode2 {
    public int no;
    public String name;
    public String nickname;
    public HeroNode2 pre;
    public HeroNode2 next;

    public HeroNode2() {
    }

    public HeroNode2(int no, String name, String nickname) {
        this.no = no;
        this.name = name;
        this.nickname = nickname;
    }

    @Override
    public String toString() {
        return "HeroNode{" +
                "no=" + no +
                ", name='" + name + '\'' +
                ", nickname='" + nickname + '\'' +
                '}';
    }
}

/**
 * 雙向鏈表,pre指向前一個節點,next指向后一個節點
 * 其實就是在單鏈表的基礎上加了pre
 */
public class DoubleLinkedList {
    private HeroNode2 head = new HeroNode2();

    // 獲得雙向鏈表的頭節點
    public HeroNode2 getHead() {
        return head;
    }

    public void setHead(HeroNode2 head) {
        this.head = head;
    }

    /**
     * 遍歷鏈表
     */
    public void list() {
        if (head.next == null) {
            System.out.println("雙向鏈表為空");
            return;
        }
        HeroNode2 temp = head.next;
        while (temp != null) {
            System.out.println(temp);
            temp = temp.next;
        }
    }

    /**
     * 逆向遍歷鏈表
     */
    public void reversalList() {
        if (head.next == null) {
            System.out.println("鏈表為空");
            return;
        }
        // 臨時變數遍歷
        HeroNode2 temp = head;
        // 先從頭跑到尾
        while (temp.next != null) {
            temp = temp.next;
        }
        // 再從尾開始往前列印
        while (temp.pre != null) {
            System.out.println(temp);
            temp = temp.pre;
        }
    }

    /**
     * 添加節點
     */
    public void add(HeroNode2 node) {
        HeroNode2 temp = head;
        // 首先找到最后一個節點
        while (temp.next != null) {
            temp = temp.next;
        }
        // 雙向鏈接
        temp.next = node;
        node.pre = temp;
    }

    /**
     * 根據編號順序添加
     * @param heroNode 添加的節點
     */
    public void addByOrder(HeroNode2 heroNode) {
        // 1.首先找到新節點的插入位置
        HeroNode2 temp = head.next;
        // 如果找到尾結點還沒有找到合適的位置,則尾插到最后
        while (temp != null && temp.no <= heroNode.no) {
            if (temp.no == heroNode.no) {
                System.out.println(heroNode.name+"已存在,不可添加");
                return;
            }
            temp = temp.next;
        }
        if (temp == null) {
            // 如果遍歷到最后還沒有合適的位置則變為尾插
            add(heroNode);
        } else {
            // 2.新節點指向當前的前節點和當前節點
            heroNode.pre = temp.pre;
            heroNode.next = temp;
            // 3.前后兩節點指向新節點
            temp.pre.next = heroNode;
            temp.pre = heroNode;
        }

    }

    /**
     * 修改
     */
    public void update(HeroNode2 node) {
        if (head.next == null) {
            System.out.println("雙向鏈表為空");
            return;
        }
        HeroNode2 temp = head.next;
        // 首先遍歷鏈表,匹配到就停止回圈
        while (temp != null && temp.no != node.no) {
            temp = temp.next;
        }
        // 匹配則找到 (空鏈有問題)
        if (temp != null) {
            temp.name = node.name;
            temp.nickname = node.nickname;
        } else {
            System.out.println("找不到修改節點");
        }

    }

    /**
     * 洗掉節點
     */
    public void delete(int no) {
        if (head.next == null) {
            System.out.println("雙向鏈表為空");
            return;
        }

        HeroNode2 temp = head.next;
        while (temp != null && temp.no != no) {
            temp = temp.next;
        }
        if (temp != null) {
            // 自身洗掉, 前節點指向后節點,后節點指向前節點,
            temp.pre.next = temp.next;
            if (temp.next != null) {
                temp.next.pre = temp.pre;
            }

        } else {
            System.out.println("找不到洗掉節點");
        }

    }
}

總結

區別 單向鏈表 雙向鏈表
尾插添加 將鏈表的最后一個節點指向新節點 將鏈表的最后一個節點指向新節點,
同時需要將新節點的父指標指向最后一個節點
通過編號排序添加 找到添加位置的【前一個】節點temp
新節點指向temp的下一個,temp指向新節點
找到添加位置的節點temp
heroNode.pre = temp.pre; heroNode.next = temp;
ttemp.pre.next = heroNode; temp.pre = heroNode;
洗掉節點 判空! 匹配到洗掉節點的【前一個】節點temp
temp.next = temp.next.next; //跳過洗掉節點
匹配到洗掉節點temp (若temp是鏈表的最后一節點,特殊處理)
temp.pre.next = temp.next; // 父節點指向子節點
if (temp.next != null) { temp.next.pre = temp.pre;}
// 如果子節點存在,子節點指向父節點,
修改節點 判空! 匹配到修改節點的編號,修改資料,做不存在處理 和單向鏈表一樣
遍歷鏈表 從頭到尾遍歷 可雙向遍歷

鏈表總結回顧

image-20200702225355005

  1. 線性表是0個或多個具有相同型別資料元素有限序列
  2. 線性表按存盤結構分為順序存盤結構和鏈式存盤結構
    • 順序存盤 -- 用陣列實作,稱為順序表,有大小限制,增刪不方便
    • 鏈式存盤 -- 用結點實作,分為多種鏈表

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/31065.html

標籤:其他

上一篇:17.動態規劃之青蛙跳臺階代碼實作(JavaScript版)

下一篇:0107. Binary Tree Level Order Traversal II (E)

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more