您的位置:首页 > 编程语言 > Java开发

反转单链表(Java描述)

2016-09-05 23:50 483 查看
问题描述:

输入一个单链表,对其元素顺序进行反转后输出。

单链表节点定义:

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息