单链表的反转,是面试中的一个高频题目。
需求:
原链表中数据为:1->2->3>4。
反转后链表中数据为:4->3->2->1。
反转API:
public void reverse():对整个链表反转。
public Node reverse(Node curr):反转链表中的某个结点curr,并把反转后的curr结点返回。
使用递归可以完成反转,递归反转其实就是从原链表的第一个存数据的结点开始,依次递归调用反转每一个结点, 直到把最后一个结点反转完毕,整个链表就反转完毕。
-- 代码:
//==============================================================================
// 在实现好的单链表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+" ");
}
}
}
-- 运行效果图:
@ 以上内容属于个人笔记