//链表形如public class ListNode{ int val;//值 ListNode next;//后继节点 //构造器 public ListNode(int val,ListNode next){ this.val = val; this.next = next; }}//执行方法public static void main(String[] args){ ListNode node5 = new ListNode(5,null); ListNode node4 = new ListNode(4,node5); ListNode node3 = new ListNode(3,node4); ListNode node2 = new ListNode(2,node3); ListNode node1 = new ListNode(1,node2); iterate(node1); recursion(node1);}
方法1:迭代
public static ListNode iterate(ListNode head){ ListNode prev = null,next; ListNode curr = head; while(curr != null){ next = curr.next;//将curr的后继赋值给变量next curr.next = prev;//此处将后继赋值为空,方便重新设置后继节点。 //当下一节点进来时,prev刚好是上一节点,即反转了两个节点 prev = curr;//前继赋值为当前节点 curr = next;//将curr当前节点赋值为下一节点,让迭代继续 } return head;}
方法2:递归
public static ListNode recursion(ListNode head){ if(head == null || head.next == null){//链表为空-无法反转/节点的后继为空-已是最后一个节点 return head;//直接返回链表 } ListNode new_listnode = recursion(head.next);//递归调用,找到链表的末尾,从末尾开始反转 //从前面反转的坏处是,一旦两者反转,则后面的节点会丢失 head.next.next = head;//将后面节点的后继改为当前节点,这样达到了反转 head.next = null;//去除当前节点原来的后继,以免形成环形链表 return new_listnode;}