import java.util.ArrayList;
public class Solution {
public static void main(String[] args)
{
//ReverseList Test
Solution sol=new Solution();
ListNode node1=new ListNode(1);
ListNode node2=new ListNode(2);
ListNode node3=new ListNode(3);
ListNode node4=new ListNode(4);
node1.next=node2;
node2.next=node3;
node3.next=node4;
node4.next=null;
ArrayList<Integer> list=sol.printListFromTailToHead(node1);
for(Integer i:list)
{
System.out.print(i+" ");
}
}
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
//新建返回对象
ArrayList<Integer> revNodeArray=new ArrayList<>();
//非空检测 如果节点值为null 直接返回null
if(listNode==null)
return revNodeArray;
else//链表非空 开始转置
{
//转置策略1:将链表值顺序插入数组 转置数组
//然后将数组转置
//因为ArrayList不方便替换值 放弃
/*转至策略2:先将链表转置,在移动数组*/
ListNode curNode=listNode;//记录头结点 在不改变头结点的情况下 使用此节点遍历
ListNode preNode=curNode;//当前位置前一节点
ListNode nextNode=curNode.next;//当前位置后一节点
preNode.next=null;//将尾节点(原链表头结点)的后一元素设置为null
/*
* 初始状态下 当前位置节点和前一位置节点为同一节点
* 此后 循环过程中也保持这种关系
* 在使用时,首先将当前位置节点后移一次
* 这样做的目的是 在循环结束后 当前位置节点即为转置后头结点
*/
while(nextNode!=null)
{
curNode=nextNode;//移动当前位置节点
nextNode=nextNode.next; //移动后一位置节点
curNode.next=preNode;//设置当前位置下一节点为前一节点
preNode=curNode;//移动前一位置节点
}
listNode=curNode;
//循环赋值到数组中
while(curNode!=null)
{
revNodeArray.add(curNode.val);
curNode=curNode.next;
}
return revNodeArray;
}
}
}
class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
剑指offer:转置链表
猜你喜欢
转载自blog.csdn.net/weixin_43823363/article/details/87734029
今日推荐
周排行