反转链表是最基础的数据结构练习题,主要是注意一下边界处理和指针方向,下面提供了两种常用思路。假定节点结构为:
static class node{
Object value;
node next;
node(Object o){
this.value = o;
}
}
头结点也已经声明好了:
static node head;
思路1:头插法。
public static void reserve1() {
if(head==null||head.next==null)
return;
node p = head.next,newHead = new node(head.value),tmp;
while(p!=null) {
tmp = new node(p.value);
tmp.next = newHead;
newHead = tmp;
p = p.next;
}
head = newHead;
}
头插法的时间复杂度和空间复杂度均为O(n)。
思路2:逆转指针。
public static void reserve2() {
if(head==null||head.next==null)
return;
node p = head,p1 = p.next,p2 = p1.next;
while(p2!=null) {
p1.next = p;
p = p1;
p1 = p2;
p2 = p2.next;
}
p1.next = p;
head.next = null;
head = p1;
}
这里需要注意将之前的头结点的指针置为null,否则最后会形成一个环。逆转指针的方法空间复杂度仅为O(1)。
如果你有更好的思路欢迎在评论区留言,欢迎点赞转发,感谢阅读。