反转单向和双向链表
【题目】 分别实现反转单向链表和反转双向链表的函数。
【要求】 如果链表长度为 N,时间复杂度要求为 O(N),额外空间复杂度要求为 O(1)。
public class ReverseList {
class Node {
private int value;
private Node next;
public Node(int value) {
this.value = value;
}
}
class DoubleNode {
private int value;
private DoubleNode next;
private DoubleNode last;
public DoubleNode(int value) {
this.value = value;
}
}
/**
* 反转单链表
* @param head
* @return
*/
public Node reverseList(Node head) {
// pre代指当前节点的前一个节点
Node pre = null;
// next代指当前节点的后一个节点
Node next = null;
// cur代指当前节点
Node cur = head;
// 当前节点不为空
while (cur != null) {
// next指向当前节点的后一个节点
next = cur.next;
// 当前节点反转指针,把指针指向前一个节点
cur.next = pre;
// 反转后pre当前节点前一个节点向后移
pre = cur;
// cur当前节点向后移
cur = next;
}
// 循环走完之后,cur指向空,pre指向了反转后的头节点
return pre;
}
/**
* 反转双向链表
* @param head
* @return
*/
public DoubleNode reverseList(DoubleNode head) {
// pre代指当前节点的前一个节点
DoubleNode pre = null;
// next代指当前节点的后一个节点
DoubleNode next = null;
// cur指向当前节点
DoubleNode cur = head;
while (cur != null) {
// 使next 指向当前节点的后一个节点
next = cur.next;
// 反转节点指向
// 当前节点的next指针指向当前节点的前一个节点
cur.next = pre;
// 当前节点的last指针指向当前节点的后一个节点
cur.last = next;
pre = cur;
cur = next;
}
return pre;
}
}
#链表#数据结构与算法 文章被收录于专栏
笔者学习数据结构与算法的心得与经验。
查看9道真题和解析