在一些笔试中看到了这个题目,所有记录一下相关的实现逻辑。
实现反转链表目前个人想到的是两个办法:
- 遍历(简单粗暴)
- 递归
一 遍历
1.1 源码
public ListNode reverseList(ListNode node){
ListNode head = null;
ListNode next = null;
while(node!=null){
next = node.next;
node.next = head;
head = node;
node = next;
}
return head;
}
1.2 实现逻辑
这里1→2→3→4为例,当节点node不为空时进行遍历,遍历中的操作如下:
next = node.next
node.next = pre
pre = node
node =next;
第一次遍历后
第二次遍历
第三次遍历
第四次遍历,此时node为空,遍历结束,返回节点head
二 递归
2.1 源码
public ListNode reverseList(ListNode node){
if(node==null||node.next==null){
return node;
}
ListNode temp = node.next;
ListNode newNode = reverseList(node.next);
temp.next = node;
node.next=null;
return newNode;
}
2.2 实现逻辑
进行递归,层层包裹,将链表反转
递归层数 | ↓ | ↑ |
---|---|---|
1 | ![]() | ![]() |
2 | ![]() | ![]() |
3 | ![]() | ![]() |
4 | ![]() |