算法演练二:反转链表

反转链表就是更改链表的当前节点和下一个节点的指向,例如: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

相关文章
相关标签/搜索