单链表反转-java语言版

323 阅读1分钟

单链表的反转,是面试中的一个高频题目。

需求:
   原链表中数据为:1->2->3>4。
   反转后链表中数据为:4->3->2->1。
反转API:
    public void reverse():对整个链表反转。
    public Node reverse(Node curr):反转链表中的某个结点curr,并把反转后的curr结点返回。
    

使用递归可以完成反转,递归反转其实就是从原链表的第一个存数据的结点开始,依次递归调用反转每一个结点, 直到把最后一个结点反转完毕,整个链表就反转完毕。

链表反转.png

-- 代码:

//==============================================================================
// 在实现好的单链表LinkList中添加下面代码
// 实现链表反转的代码

// 对整个链表进行反转
public void reverse() {
    if(N == 0) {
        // 当前空表不需要反转
        return;
    }
    reverse(head.next);
}

// 将当前结点的上一个结点进行反转
public Node reverse(Node curr) {
    if(curr.next == null) {
        // 最后一个结点,将头结点指向最后一个结点
        head.next = curr;
        return curr;
    }
    // 当前结点的上一个结点
    Node pre = reverse(curr.next);
    // 上一个结点指向当前结点
    pre.next = curr;
    // 将当前结点的下一个结点设为null
    curr.next = null;
    // 返回当前结点
    return curr;
}

-- 测试代码:

public class LinkListTest {
    public static void main(String[] args) throws Exception {
        LinkList<Integer> list = new LinkList<>();
        list.insert(1);
        list.insert(2);
        list.insert(3);
        list.insert(4);
        for (Object i : list) {
            System.out.print(i+" ");
        }
        System.out.println();
        System.out.println("--------------------");
        list.reverse();
        for (Object i : list) {
            System.out.print(i+" ");
        }
    }
}

-- 运行效果图:

运行效果图001.png

@ 以上内容属于个人笔记