需求
实现单链表的反转
示例:
思路(在了解链表结构的情况下,只需要看reverseList方法即可):
单链表的结构是,节点本身除了存储数据外,还会通过指针记录当前节点的下个节点。需求中需要实现反转功能,只需要调整指针即可。eg:假设有A/B/C三个节点,现在要将B节点换到第一个位置上,对于B节点来说,我需要知道我前面的节点和后面的节点。首先知道B节点前面的节点,那么就知道B节点调整后的指针需要指向的位置(调整后,B节点指针需要指向A);其次我知道B节点后面的节点,那就意味着我知道下一个需要反转的节点是哪个;最后我还需要知道我当前需要反转的节点,即B。
代码:
package com.demo.git;
public class ListNode {
protected int val;
protected ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
class Solution {
public ListNode reverseList(ListNode head) {
ListNode preNode = null;//前一个元素
ListNode currNode = null;//当前元素
ListNode nextNode = null;//记录当前正在遍历的下一个节点
do{
if(null == head){//如果当前节点是空,则直接返回
return null;
}
if(null == preNode){//遍历第一个元素后,针对下个元素的前一个元素、下一个元素重新赋值
currNode = head;//当前元素
preNode = head;
nextNode = head.next;//后续需要遍历的元素
currNode.next = null;
}else{
currNode = nextNode;
nextNode = nextNode.next;
currNode.next = preNode;
preNode = currNode;
}
}while(null != nextNode);
return currNode;
}
public static void main(String[] args) {
ListNode five = new ListNode(5);
ListNode four = new ListNode(4);
ListNode three = new ListNode(3);
ListNode second = new ListNode(2);
ListNode head = new ListNode(1);
head.next = second;
second.next = three;
three.next = four;
four.next = five;
System.out.print("反转前的结果:");
ListNode node = head;
while(null != node) {
System.out.print(node.val+"\t");
node = node.next;
}
System.out.print("\n\n反转后的结果:");
node = new Solution().reverseList(head);
while(null != node) {
System.out.print(node.val+"\t");
node = node.next;
}
}
}
自愿打赏