1. //链表形如
  2. public class ListNode{
  3. int val;//值
  4. ListNode next;//后继节点
  5. //构造器
  6. public ListNode(int val,ListNode next){
  7. this.val = val;
  8. this.next = next;
  9. }
  10. }
  11. //执行方法
  12. public static void main(String[] args){
  13. ListNode node5 = new ListNode(5,null);
  14. ListNode node4 = new ListNode(4,node5);
  15. ListNode node3 = new ListNode(3,node4);
  16. ListNode node2 = new ListNode(2,node3);
  17. ListNode node1 = new ListNode(1,node2);
  18. iterate(node1);
  19. recursion(node1);
  20. }

方法1:迭代

  1. public static ListNode iterate(ListNode head){
  2. ListNode prev = null,next;
  3. ListNode curr = head;
  4. while(curr != null){
  5. next = curr.next;//将curr的后继赋值给变量next
  6. curr.next = prev;//此处将后继赋值为空,方便重新设置后继节点。
  7. //当下一节点进来时,prev刚好是上一节点,即反转了两个节点
  8. prev = curr;//前继赋值为当前节点
  9. curr = next;//将curr当前节点赋值为下一节点,让迭代继续
  10. }
  11. return head;
  12. }

方法2:递归

  1. public static ListNode recursion(ListNode head){
  2. if(head == null || head.next == null){//链表为空-无法反转/节点的后继为空-已是最后一个节点
  3. return head;//直接返回链表
  4. }
  5. ListNode new_listnode = recursion(head.next);//递归调用,找到链表的末尾,从末尾开始反转
  6. //从前面反转的坏处是,一旦两者反转,则后面的节点会丢失
  7. head.next.next = head;//将后面节点的后继改为当前节点,这样达到了反转
  8. head.next = null;//去除当前节点原来的后继,以免形成环形链表
  9. return new_listnode;
  10. }