算法演練二:反轉鏈表

反轉鏈表就是更改鏈表的當前節點和下一個節點的指向,例如:1->2->3 反轉之後就是3->2->1,咱們採用遍歷法作題分析,步驟以下:java

  • 保存cur節點的next域(下一個節點),若是不保存,直接更改那麼後面就找不到這個next節點了。
  • 修改next節點的指向,指向cur。
  • 遍歷下一個節點,重複上面的操做。 對應的java實現方式以下:
public Node reverseLink(Node head){
        if(head == null)return;
        Node pre = head;
        Node cur = head.next;
        Node tmp;
        while (cur != null){
            //保存next域
            tmp = cur.next;
            
            //修改next的指向
            cur.next = pre;
            
            //遍歷下一個節點
            pre = cur;
            cur = tmp;
        }
        // 最後舊鏈表的next域設爲null
        head.next = null;
        return pre;
    }
    
    /**
 * data 表明當前節點的值
 * next 表明下一個節點
 * */
public class Node {
    public Node next = null;
    public int data;

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

複製代碼

有部分同窗在早期沒有敲過完整的鏈表,只看片斷,有時候很難理解,這裏我補充詳細一點,直接能夠複製運行:bash

public class LinkTest{
  /**
     * 向鏈表中加入節點,添加節點是在最尾部加,也就是新建鏈表
     * */
    public void addNode(int data){
        Node newNode = new Node(data);
        if (head == null){
            head = newNode;
            return;
        }
        Node tmp = head;
        //查找最後一個節點
        while (tmp.next != null){
            tmp = tmp.next;
        }
        tmp.next = newNode;
    }  
}
  
    
public class Main {

    public static void main(String[] args){
        operateLink();
    }

    private static void operateLink() {
        LinkTest linkTest = new LinkTest();
        for (int i = 1; i < 7; i++){
            linkTest.addNode(i);
        }
          linkTest.reverseLink(linkTest.head);

    }
複製代碼

好了,代碼看上去很簡單,可是理解起來不是那麼容易,鏈表的題目讀者最好是在草稿紙上畫畫圖,這樣思路會更加清晰。ui

ps:若是對您有幫助,麻煩點個贊,謝謝您的閱讀。this

相關文章
相關標籤/搜索