算法演练二:反转链表

170 阅读1分钟

反转链表就是更改链表的当前节点和下一个节点的指向,例如:1->2->3 反转以后就是3->2->1,我们采用遍历法做题分析,步骤如下:

  • 保存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;
    }
}

有部分同学在早期没有敲过完整的链表,只看片段,有时候很难理解,这里我补充详细一点,直接可以复制运行:

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);

    }

好了,代码看上去很简单,但是理解起来不是那么容易,链表的题目读者最好是在草稿纸上画画图,这样思路会更加清晰。

ps:如果对您有帮助,麻烦点个赞,谢谢您的阅读。