206 https://leetcode.com/problems/reverse-linked-list/
Reverse a singly linked list.
/**
* Definition for singly-linked list.
* public class ListNode {
* public int val;
* public ListNode next;
* public ListNode(int x) { val = x; }
* }
*/
public class Solution
{
public ListNode ReverseList(ListNode head)
{
if (head == null || head.next == null)
return head;
ListNode pre=null, next;
while (head != null)
{
next = head.next;
head.next = pre;
pre = head;
head = next;
}
return pre;
}
}
递归
public ListNode ReverseList(ListNode head)
{
if (head == null || head.next == null)
return head;
ListNode next = head.next;
head.next = null;
ListNode node = ReverseList(next);
next.next = head;
return node;
}
92 https://leetcode.com/problems/reverse-linked-list-ii/
Reverse a linked list from position m to n. Do it in-place and in one-pass.
For example:
Given 1->2->3->4->5->NULL
, m = 2 and n = 4,
return 1->4->3->2->5->NULL
.
Note:
Given m, n satisfy the following condition:
1 ≤ m ≤ n ≤ length of list.
/**
* Definition for singly-linked list.
* public class ListNode {
* public int val;
* public ListNode next;
* public ListNode(int x) { val = x; }
* }
*/
使用栈:(低效)
public ListNode ReverseBetween(ListNode head, int m, int n)
{
if(head.next==null||m==n)
return head;
ListNode pre = new ListNode(0);
pre.next = head;
ListNode curNode = pre;
Stack<ListNode> stack = new Stack<ListNode>();
for (int i = 0; i < m; i++)
{
curNode = curNode.next;
}
for (int i = m; i <= n; i++)
{
stack.Push(curNode);
curNode = curNode.next;
}
ListNode leftNode = curNode;
curNode = pre;
for (int i = 0; i < m - 1; i++)
{
curNode = curNode.next;
}
while (stack.Count!=0)
{
curNode.next = stack.Pop();
curNode = curNode.next;
}
curNode.next = leftNode;
return pre.next;
}
不用栈
public ListNode ReverseBetween(ListNode head, int m, int n)
{
if (head.next == null || m == n)
return head;
ListNode pre = new ListNode(0);
pre.next = head;
ListNode curNode = pre;
for (int i = 0; i < m - 1; i++)
{
curNode = curNode.next;
}
ListNode first = curNode.next;
ListNode next = first.next;
for (int i = m; i < n; i++)
{
first.next = next.next;
next.next = curNode.next;
curNode.next = next;
next = first.next;
}
return pre.next;
}