剑指offer:转置链表

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;
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_43823363/article/details/87734029