链表反转
题目:输入一个链表,反转链表后,输出新链表的表头。
思路:
1.从第一个节点开始逐个往后扫描
2.扫描到的节点为head,head的前一个节点为pre,后一个节点为next
3.next保存head的下一个节点,再断开head和后一个节点的连接,防止链表丢失
4.把pre赋给head.next,断开head与它后一个节点的连接,并连接head和他上一个节点
5.把head赋给pre,移动head到next的位置
6.循环3-5的步骤
代码:
public class Solution { public ListNode ReverseList(ListNode head) { if(head == null) return null; ListNode pre = null; ListNode next = null; while(head != null){ next = head.next; head.next = pre; pre = head; head = next; } return pre; } }
递归的方法:
递归遍历到最后一个节点,然后把当前节点设置为后面节点的后续节点,
public class Solution { public ListNode ReverseList(ListNode head) { //如果链表为空或者链表中只有一个元素 if(head==null||head.next==null) return head; //先反转后面的链表,走到链表的末端结点 ListNode pReverseNode=ReverseList(head.next); //再将当前节点设置为后面节点的后续节点 head.next.next=head; head.next=null; return pReverseNode; } }