java編寫帶頭結點的單鏈表

最近在牛客網上練習在線編程,希望自己堅持下去,每天都堅持下去練習,給自己一個沉澱,不多說了

我遇到了一個用java實現單鏈表的題目,就自己在做題中將單鏈表完善了一下,希望大家作爲參考也熟悉一下,自己

比較喜歡用java語言,所以就使用java實現單鏈表了。

爲了方便,帶頭結點的單鏈表更容易操作和使用,即第一個節點不存儲值,可以存儲一些標記等

一、創建單鏈表結構ListNode

/**
 * @ProjectName: JavaPractice
 * @Package: com.itwang.swordtooffer
 * @ClassName: ListNode
 * @Author: JikeWang
 * @Description:ListNode是一個帶頭結點的單鏈表,頭結點不存值
 * @Date: 2018-11-19 15:46
 * @Version: 1.0
 */
public class ListNode {
    int val;//節點的值
    ListNode next = null;//節點的指針

    ListNode(int val){
        this.val = val;
    }

}

二、創建一個鏈表操作類

/**
 * @ProjectName: JavaPractice
 * @Package: com.itwang.swordtooffer
 * @ClassName: LNodeOperation
 * @Author: JikeWang
 * @Description:
 * @Date: 2018-11-19 15:56
 * @Version: 1.0
 */
public class LNodeOperation {
    //將一個新節點添加到鏈表尾部
    public static void addNode(ListNode listNode, ListNode node){
        //如果鏈表是一個空鏈表,則將此節點賦給鏈表
        if (listNode == null)
            listNode = node;
        if (listNode != null){
            while (listNode.next != null){
                listNode = listNode.next;
            }
            listNode.next = node;
        }
    }
    //將node2節點插入到node1後面
    public static void addNode(ListNode listNode, ListNode node1, ListNode node2){
        ListNode currNode;
        while(listNode.next != null){
            currNode = listNode.next;
            if (currNode.val == node1.val){
                //注意這裏需要先將插入的節點的next指向鏈表插入位置後面
                //再將插入位置的next指向插入節點
                node2.next = currNode.next;
                listNode.next.next = node2;
                break;
            }
            listNode = currNode;
        }
    }
    //刪除鏈表中的某個值(此鏈表頭結點不存入值)
    public static void removeNode(ListNode listNode, ListNode node){
        ListNode currNode;
        while (listNode.next != null) {
            currNode = listNode.next;
            if (currNode.val == node.val){
                listNode.next = currNode.next;
            }
            listNode = currNode;
        }
    }
    //從頭部到尾部打印出鏈表的值(跳過鏈表的頭結點)
    public static void showListNode(ListNode listNode){
        listNode = listNode.next;
        while (listNode != null){
            System.out.println(listNode.val);
            listNode = listNode.next;
        }
    }
    //獲取鏈表的長度
    public static int getLenOfLNode(ListNode listNode){
        int len = 0;
        listNode = listNode.next;
        while (listNode != null){
            len++;
            listNode = listNode.next;
        }
        return len;
    }

    public static void main(String[] args) {
        //創建一個頭結點
        ListNode listNode = new ListNode(000);
        //創建三個節點,爲後面測試使用
        ListNode l1 = new ListNode(1);
        ListNode l2 = new ListNode(5);
        ListNode l3 = new ListNode(4);

        addNode(listNode, l1);
        addNode(listNode, l2);
        addNode(listNode, l3);
        showListNode(listNode);
        System.out.println("=====================");
        System.out.print("鏈表的長度爲:");
        System.out.println(getLenOfLNode(listNode));
        System.out.println("=====================");
        System.out.println("刪除l2節點:");
        removeNode(listNode, l2);
        showListNode(listNode);
        System.out.println("=====================");
        System.out.println("插入l2節點");
        addNode(listNode, l1, l2);
        showListNode(listNode);
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章