反转单链表
以下是将单链表反转的Java代码实现:
public class ListNode {
int val;
ListNode next;
ListNode(int x) { val = x; }
}
public class Solution {
public ListNode reverseList(ListNode head) {
ListNode prev = null;
ListNode current = head;
ListNode nextNode;
while(current != null) {
nextNode = current.next;
current.next = prev;
prev = current;
current = nextNode;
}
return prev;
}
}
在上述代码中,我们首先定义了一个ListNode类,它表示单链表中的一个节点,包含一个值val和指向下一个节点的指针next。然后,我们定义了一个Solution类,它包含了一个方法reverseList,该方法接受一个ListNode作为参数,并返回反转后的链表头节点。
在reverseList方法中,我们定义了三个指针:prev,current和nextNode。初始时,prev指针为null,current指向链表头节点,nextNode指向current的下一个节点。
在while循环中,我们将current的指针反转指向prev,然后将prev指针更新为current,将current指针更新为nextNode。重复这个过程直到current指针为null。最后,我们返回prev指针,它指向反转后的链表头节点。
要使用这个代码,只需要创建一个链表并将其传递给reverseList方法即可。例如:
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;
Solution solution = new Solution();
ListNode reversedHead = solution.reverseList(node1);
在这个示例中,我们创建了一个包含5个节点的单链表,并将其传递给reverseList方法。最后,我们得到了反转后的链表头节点reversedHead。
代码注释
以下是反转单链表的Java代码和注释:
class ListNode {
int val;
ListNode next;
ListNode(int val) {
this.val = val;
}
}
public class Solution {
public ListNode reverseList(ListNode head) {
// 用于存储当前节点的前一个节点
ListNode prev = null;
// 用于存储当前节点的下一个节点
ListNode next = null;
// 当前节点初始化为头节点
ListNode curr = head;
// 遍历链表
while (curr != null) {
// 保存当前节点的下一个节点
next = curr.next;
// 将当前节点的next指针指向前一个节点
curr.next = prev;
// 将prev指针移动到当前节点
prev = curr;
// 将curr指针移动到下一个节点
curr = next;
}
// 当curr == null时,prev指向原链表的尾节点,也就是反转后的头节点
return prev;
}
}
这段代码中,我们创建了一个名为ListNode的节点类,它包含一个整数值和指向下一个节点的指针。我们还创建了一个名为Solution的类,它包含一个名为reverseList的方法,该方法接收一个链表的头节点作为参数,并返回反转后的链表的头节点。
在reverseList方法中,我们首先初始化prev和next指针为null,并将curr指针初始化为传入的头节点。接着,我们遍历链表,每次迭代时将当前节点的next指针指向prev,然后将prev指针移动到当前节点,将curr指针移动到下一个节点。最后,当curr指针为null时,我们返回prev指针,该指针指向反转后的链表的头节点。