今天又开始从头复习数据结构,在一本书中(《算法与数据结构——Java语言描述》陈媛,涂飞,卢玲,何波编著)看到了如下的翻转单链表的代码:
package com.zby.test1;
class Node {
int data;
Node next;
Node(int data) {
this.data = data;
}
}
public class Invert {
static Node invert(Node head) {
Node p, q, r;
if(head==null||head.next==null){
System.out.println("逆置的单链表至少有2个节点!");
return null;
}
else {
p = head;//p指向head所指向的节点
q = p.next;//q指向p所指向的节点的下一个节点
while(q!=null) {
r = q.next;//r指向q所指向的节点的下一个节点
q.next = p;//q所指向的节点的下一个节点指向p
p = q;//p指向了q所指向的节点(把q赋给p,意思就是p变成了q)
q = r;//q指向了r所指向的节点(把r赋给q,意思就是q变成了r)
}
head.next = null;//head所指向的节点的下一个节点为空
head = p;//head指向了p所指向了节点,此时head又变成了头结点
return head;
}
}
}
于是我把代码好好地研究了一番,并写下了注释,我现在是看懂了这个代码。
我自己的心得就是其实指针的意思就是它就是一个标记,代码中的head,p,q,r其实都是标记而已,通过标记来操作链表中的每一个节点。
希望能够给那些对链表指向还有些不太明白的同学带来些帮助。