题目
反转单链表,可以使用迭代或者递归的方法
思路
具象化反转单链:
反转前:
反转中:
反转后:
(PS:上述图片搬运自 链表面试题(一):反转链表的算法实现)
- 用文字来描述上图的步骤:
1. 将V节点的next,指向上一个节点U
2. 在步骤1完成前,需要有一个局部变量值记录住W节点,否则W节点就会遗失
3. 最后指针指向W节点,继续下一个节点的处理
代码
package algorithm9;
import algorithm6.ListNode;
public class Algorithm9 {
public static void main(String[] args) {
ListNode test = getListNode1();
System.out.println(test.toString());
test = reverseListNode2(test, null);
System.out.println(test.toString());
}
/**方法一:迭代
* 注意点:tempNext == null 时,说明已经迭代到最后一个节点了,这时为headNode赋值
* @param listNode
* @return
*/
public static ListNode reverseListNode(ListNode listNode) {
ListNode pre = null;
ListNode headNode = null;
while(listNode != null) {
ListNode tempNext = listNode.next;
listNode.next = pre;
pre = listNode;
if(tempNext == null)
headNode = listNode;
listNode = tempNext;
}
return headNode;
}
/**方法二:递归
* 注意点:listNode.next == null 时,说明已经迭代到最后一个节点了
* 与迭代方法不同的是,这里没有固定局部变量来记录头结点,所以就需要将整个链表串成一个完整的链表
* @param listNode
* @param pre
* @return
*/
public static ListNode reverseListNode2(ListNode listNode, ListNode pre) {
if(listNode.next == null) {
listNode.next = pre;
return listNode;
}
ListNode tempNext = listNode.next;
listNode.next = pre;
pre = listNode;
listNode = tempNext;
return reverseListNode2(listNode, pre);
}
public static ListNode getListNode1() {
ListNode listNode2 = new ListNode(0);
ListNode listNode4 = new ListNode(1);
ListNode listNode6 = new ListNode(2);
ListNode listNode8 = new ListNode(3);
ListNode listNode10 = new ListNode(4);
ListNode listNode11 = new ListNode(5);
ListNode listNode12 = new ListNode(5);
ListNode listNode13 = new ListNode(4);
listNode2.next = listNode4;
listNode4.next = listNode6;
listNode6.next = listNode8;
listNode8.next = listNode10;
listNode10.next = listNode11;
listNode11.next = listNode12;
listNode12.next = listNode13;
return listNode2;
}
}