單鏈表的代碼(java)

1、單鏈表代碼實現

   

/**
 * 文件描述:手寫單鏈表以及單鏈表的翻轉(不考慮代碼優化的情況)
 * 作者:chenjingkun708
 * 創建時間:2020/3/20
 * 更改時間:2020/3/20
 */
public class MyLinkedList<V>{
    Node<V> head;
    int size;
    public MyLinkedList(){

    }

    /*
     * 添加
     */
    public V add(V value){
        if (value==null){
            return null;
        }
        Node<V> newNode = new Node<>(value,null);
        if (head==null){
            head = newNode;
        }else {
            Node first = head;
            while (first.next!=null){
                first = first.next;
            }
            first.next = newNode;
        }
        size++;
        return value;
    }



    /*
     獲取某個位置的值
     */
    public V get(int index){
        if (index< 0 && index>=size){
            return null;
        }
        int num = 0;
        Node<V> node = head;
        while (node!=null&&num++!=index){
            node = node.next;
        }
        if (node!=null){
            return node.value;
        }
        return null;
    }

    /*
      移除
     */
    public boolean remove(int index){
        int num = 0;
        Node<V> node = head;
        Node<V> pre = null;
        while (node!=null&&num++!=index){
            pre = node;
            node = node.next;
        }
        if (node!=null){
            Node next = node.next;
            pre.next = next;
            return true;
        }
        return false;
    }

    //打印列表
    public void printAll(){
        Node first = head;
        while (first!=null){
            Log.i("android_test",""+first.value);
            first = first.next;
        }
    }

    static class Node<V>{
        V value;
        Node<V> next;

        public Node(V value, Node<V> next) {
            this.value = value;
            this.next = next;
        }
    }
}

二、單鏈表的翻轉

 

方式1、就地反轉(需保留上一個節點)

代碼實現

/*
  翻轉列表(採用的是就地翻轉的方法,從頭部開始反轉)
 */
public void reserve(){
    Node<V> node = head,preNode = null,nextNode= null;
   while (node!=null){
       nextNode = node.next;
       node.next = preNode;
       preNode = node;
       node = nextNode;
   }
   head = preNode;
}

方式2、遞歸方式(從尾巴開始反轉)

詳細看文章https://www.jianshu.com/p/36ed87e1937a解釋與實現

 

二、代碼測試

MyLinkedList myLinkedList = new MyLinkedList();
myLinkedList.add(1);
myLinkedList.add(2);
myLinkedList.add(3);
myLinkedList.add("chenjk");
myLinkedList.add(5);
myLinkedList.printAll();

Log.i("android_test","獲取第三個位置的值="+myLinkedList.get(3));
myLinkedList.remove(3);
myLinkedList.printAll();
myLinkedList.reserve();
Log.i("android_test","翻轉打印");
myLinkedList.printAll();

打印結果:

2020-03-24 16:41:00.874 32688-32688/example.ndk.cjk.datastructdemo I/android_test: 1
2020-03-24 16:41:00.874 32688-32688/example.ndk.cjk.datastructdemo I/android_test: 2
2020-03-24 16:41:00.874 32688-32688/example.ndk.cjk.datastructdemo I/android_test: 3
2020-03-24 16:41:00.874 32688-32688/example.ndk.cjk.datastructdemo I/android_test: chenjk
2020-03-24 16:41:00.874 32688-32688/example.ndk.cjk.datastructdemo I/android_test: 5
2020-03-24 16:41:00.874 32688-32688/example.ndk.cjk.datastructdemo I/android_test: 獲取第三個位置的值=chenjk
2020-03-24 16:41:00.874 32688-32688/example.ndk.cjk.datastructdemo I/android_test: 1
2020-03-24 16:41:00.874 32688-32688/example.ndk.cjk.datastructdemo I/android_test: 2
2020-03-24 16:41:00.874 32688-32688/example.ndk.cjk.datastructdemo I/android_test: 3
2020-03-24 16:41:00.874 32688-32688/example.ndk.cjk.datastructdemo I/android_test: 5
2020-03-24 16:41:00.874 32688-32688/example.ndk.cjk.datastructdemo I/android_test: 翻轉打印
2020-03-24 16:41:00.874 32688-32688/example.ndk.cjk.datastructdemo I/android_test: 5
2020-03-24 16:41:00.874 32688-32688/example.ndk.cjk.datastructdemo I/android_test: 3
2020-03-24 16:41:00.874 32688-32688/example.ndk.cjk.datastructdemo I/android_test: 2
2020-03-24 16:41:00.874 32688-32688/example.ndk.cjk.datastructdemo I/android_test: 1
 

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