链表算法题(程序员面试宝典)
解题思路主要来源于leetcode官方与《程序员面试宝典》。
206. 反转链表
反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
进阶:
你可以迭代或递归地反转链表。你能否用两种方法解决这道题?
解题方法
解题思路1
利用双指针,遍历链表,将当前节点的指向前驱节点,以达到反转链表的效果。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode reverseList(ListNode head) {
ListNode preNode = null;
ListNode curNode = head;
while(curNode!=null){
//存储当前节点的后继节点
ListNode tempNode = curNode.next;
//将当前节点指针反转指向前驱
curNode.next = preNode;
//更新preNode , curNode
preNode = curNode;
curNode = tempNode;
}
return preNode;
}
}
解题思路2
递归的去遍历链表,然后将链表的节点链接在反转链表中。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode reverseList(ListNode head) {
if(head==null)
return null;
ListNode node = reverse(head);
//尾插法
node.next = tailNode.next;
tailNode.next = node;
return newHead.next;
}
ListNode newHead = new ListNode(-1);
ListNode tailNode = newHead;
public ListNode reverse(ListNode node){
//迭代结束条件
if(node.next==null){
return node;
}
//返回上一层节点
ListNode newNode = reverse(node.next);
//尾插法
newNode.next = tailNode.next;
tailNode.next = newNode;
//更新尾指针
tailNode = newNode;
//返回当前层节点
return node;
}
}
解题思路3
题解来源:https://leetcode-cn.com/problems/reverse-linked-list/solution/dong-hua-yan-shi-206-fan-zhuan-lian-biao-by-user74/
递归思想反转链表。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode reverseList(ListNode head) {
//终止条件
if(head==null||head.next==null){
return head;
}
//rNode 为原链表的尾节点,新的链表(反转后的链表)的头节点
ListNode rNode = reverseList(head.next);
//反转指针
head.next.next = head;
//断开原链表连接
head.next = null;
return rNode;
}
}