反转链表
题目:
思路:
-
遍历法
-
判断当前的头结点是否为空,若不为空进入循环
-
将头结点的下一节点取出赋值给next节点
-
然后将头结点的下一节点指向pre(然后将当前头结点的指赋值给pre,因为java没有指针,这种赋值的方式不会改变内部的指针指向,即head的操作实际第一步为1->null,第二次为2->1->null,第三次为3->2->1->null,实际只是将地址引用的值赋值给了pre)
-
将next赋值给head,即将余剩的链接变为新的链接传下去
-
递归法
-
我们来看是怎样的一个递归过程:1->2->3->4
-
程序到达Node newHead = reverse(head.next);时进入递归
-
我们假设此时递归到了3结点,此时head=3结点,temp=3结点.next(实际上是4结点)
-
执行Node newHead = reverse(head.next);传入的head.next是4结点,返回的newHead是4结点。
-
接下来就是弹栈过程了
-
程序继续执行 temp.next = head就相当于4->3
-
head.next = null 即把3结点指向4结点的指针断掉。
-
返回新链表的头结点newHead
代码示例:
int val;
ListNode next = null;
}
public class Solution {
public static void main(String[] args) {
ListNode node = new ListNode(), top = node;
node.val = 1;
for (int i = 2; i < 10; i++) {
ListNode newNode = new ListNode();
newNode.val = i;
node.next = newNode;
node = newNode;
}
//这里是用于打印出你原本所设置的链表的全部,之所以要赋值,是因为链表是一个个的遍历下去的当指向最后一个时不容易找到头指针
ListNode temp = top;
while (temp.next != null) {
System.out.println(temp.val);
temp = temp.next;
}
System.out.println(temp.val);
System.out.println("");
// //这里用遍历法进行反转
// ListNode data = reverseIteratively1(top);
// //将反转后的进行打印
// while (data.next != null) {
// System.out.println(data.val);
// data = data.next;
// }
// System.out.println(data.val);
//这里用递归法进行反转
ListNode data = reverseIteratively2(top);
//将反转后的进行打印
while (data.next != null) {
System.out.println(data.val);
data = data.next;
}
System.out.println(data.val);
}
/**
* 递归法
*
* @param head
* @return
*/
public static ListNode reverseIteratively2(ListNode head) {
if (head == null || head.next == null)
return head;
ListNode temp = head.next;
ListNode newHead = reverseIteratively2(head.next);
temp.next = head;
head.next = null;
return newHead;
}
/**
* 遍历法
*
* @param head
* @return
*/
public static ListNode reverseIteratively1(ListNode head) {
ListNode pre = null;
ListNode next = null;
while (head != null) {
next = head.next;
head.next = pre;
pre = head;
head = next;
}
return pre;
}
}