问题描述:
输入一个单链表,对其元素顺序进行反转后输出。
单链表节点定义:
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
解法一:
从头节点开始,对每一个节点的next引用的方向进行反转,直到最后一个节点结束,代码如下:
public ListNode ReverseList(ListNode head) {
if (head == null)
return head;
ListNode cur = head; // 当前指向节点
ListNode pre = null; // cur节点的前个一节点
ListNode tmp = null; // 辅助引用
while (cur != null) {
tmp = cur.next;
cur.next = pre; // 反转引用
/* 将pre、cur前移一个节点 */
pre = cur;
cur = tmp;
}
return pre;
}
解法二:
进行如下迭代:删除头节点的后面一个节点,并加入到新链表的头部,直到头节点变成链表的最后一个节点结束。此法只涉及链表的两个基本操作:删除节点,加入节点。代码如下:
public ListNode ReverseList(ListNode head) {
if (head == null) // 空链表
return null;
ListNode oldHead = head;
while (oldHead.next != null) {
// 删除原头结点的下一个节点
ListNode tmp = oldHead.next;
oldHead.next = oldHead.next.next;
// 将被删除节点放到链表头部
tmp.next = head;
head = tmp;
}
return head;
}
解法三:
使用递归。对头节点后面的子链表进行反转,此后头节点会指向子链表的最后一个节点,修改相关我引用使其变成尾节点:
public ListNode ReverseList(ListNode head) {
if (head == null) // 输入为null
return null;
if (head.next == null) // 递归终止条件
return head;
ListNode ptr = head;
head = ReverseList(head.next); // 反转子链表
/* 头节点此时指向链表的最后一个节点,修改其next为null,
并将子链表最后一个节点指向它,头节点就变成了尾节点*/
ptr.next.next = ptr;
ptr.next = null;
return head;
}