LeeCode打卡第十五天
第一题:反转链表(LeeCode第206题):
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
解法一:
主要思想:设置了一个头结点,然后将整个链表看作三段,头节点一段,排好序的一段,没排好序的一段,每次从未排好序的一段中取出第一个元素,放于头节点之后,排好序的第一个数之前,操作过程中注意指针的保存与修改
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode reverseList(ListNode head) {
if(head == null) return null;
ListNode dummyhead = new ListNode(0);
dummyhead.next = head;
ListNode cur = head.next;
head.next = null;
while(cur != null){
ListNode tmp = cur.next;
cur.next = dummyhead.next;
dummyhead.next = cur;
cur = tmp;
}
return dummyhead.next;
}
}
解法二:双指针
主要思想:设置了一个头结点,然后将整个链表看作三段,头节点一段,排好序的一段,没排好序的一段,每次从未排好序的一段中取出第一个元素,放于头节点之后,排好序的第一个数之前,操作过程中注意指针的保存与修改
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode reverseList(ListNode head) {
ListNode cur = head;
ListNode pre = null;
while(cur != null){
ListNode tmp = cur.next;
cur.next = pre;
pre = cur;
cur = tmp;
}
return pre;
}
}