反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
/**
* Definition for singly-linked list.
*/
class ListNode {
int val;
ListNode next;
ListNode(int x) { val = x; }
}
/**
* 反转链表
* 1. 遍历链表, 使用集合保存数据元素, 新声明一个链表, 遍历集合复制 时间复杂度是O(n)
* 2. 声明两个链表, 直接反转(有种数组中两个元素交换的感觉)
* <p>
* 输入: 1->2->3->4->5->NULL
* 输出: 5->4->3->2->1->NULL
* <p/>
* 执行用时 :0 ms, 在所有 java 提交中击败了100.00%的用户
* 内存消耗 :37 MB, 在所有 java 提交中击败了45.52%的用户
* @param head 链表头
* @return
*/
public static ListNode reverseList(ListNode head) {
if(head == null) {
return null;
}
ListNode cur = head,
pre = null,
temp = null;
while(cur != null) {
temp = cur.next;
cur.next = pre;
pre = cur;
cur = temp;
}
return pre;
}
/**
* 执行用时 :3 ms, 在所有 java 提交中击败了 7.38%的用户
* 内存消耗 :36.8 MB, 在所有 java 提交中击败了50.79% 的用户
* @param head
* @return
*/
public static ListNode reverseList1(ListNode head) {
if(head == null) {
return null;
}
List<Integer> list = new ArrayList<>();
while(head != null) {
list.add(0,head.val);
head = head.next;
}
ListNode result = new ListNode(list.get(0));
ListNode temp = result;
for (int i = 1; i < list.size(); i++) {
ListNode node = new ListNode(list.get(i));
result.next = node;
result = node;
}
return temp;
}
// 测试
ListNode node1 = new ListNode(1);
ListNode node2 = new ListNode(2);
ListNode node3 = new ListNode(3);
ListNode node4 = new ListNode(4);
ListNode node5 = new ListNode(5);
node1.next = node2;
node2.next = node3;
node3.next = node4;
node4.next = node5;
node5.next = null;
ListNode node = reverseList(node1);
while (node != null) {
System.out.println(node.val);
node = node.next;
}
原文:https://www.cnblogs.com/wadmwz/p/11725379.html