反转单向链表和双向链表

问题描述:

反转单向链表和双向链表。

算法实现:

1.单链表反转

public class Node {

public int value;
public Node next;

public Node(int value) {
this.value = value;
}
}


public Node reverseList(Node head) {

Node pre = null;
Node next = null;
while (head != null) {

next = head.next;
head.next = pre;
pre = head;
head = next;
}
return pre;
}

2.双链表反转

public class DoubleNode {

public int value;
public DoubleNode last;
public DoubleNode next;

public DoubleNode(int value) {
this.value = value;
}
}


public DoubleNode reverseList(DoubleNode head) {

DoubleNode pre = null;
DoubleNode next = null;

while (head != null) {

next = head.next;
head.next = pre;
head.last = next;//注意区别
pre = head;
head = next;
}

return pre;
}

算法解析:

1.单链表反转

(1)单链表的反转,用两个额外的Node变量,一个用于临时保存Head结点的下一个结点,一个用作反转后的链表的头结点;

(2)需要注意的是,如何断,如何标示未被逆转的链表,如何生成逆转后的链表的头结点并不断的增加元素。

2.双链表反转

双链表反转区别与单链表主要是在于要为当前结点设置“前驱结点”,而当前结点的后一个结点在反转的时候将成为其前驱结点。

猜你喜欢

转载自www.cnblogs.com/heibingtai/p/12649961.html